2013-08-26 49 views
6

Czytam Java EE 7 Tutorial z http://docs.oracle.com/javaee/7/tutorial/doc/jsf-facelets005.htm#GIQZRKorzystanie nową nazw xmlns.jcp.org na kompozytach powoduje java.lang.NullPointerException na java.util.concurrent.ConcurrentHashMap.putIfAbsent

Po wpisaniu kodu przykład w w rozdziale 8.5 Komponenty kompozytowe w moim IDE i uruchomić przykład na GlassFish4.0, mam błąd

java.lang.NullPointerException 
    at java.util.concurrent.ConcurrentHashMap.putIfAbsent(ConcurrentHashMap.java:1078) 
    at com.sun.faces.util.Cache.get(Cache.java:116) 
    at com.sun.faces.application.view.FaceletViewHandlingStrategy.getComponentMetadata(FaceletViewHandlingStrategy.java:237) 
    at com.sun.faces.application.ApplicationImpl.createComponent(ApplicationImpl.java:951) 
    at javax.faces.application.ApplicationWrapper.createComponent(ApplicationWrapper.java:648) 

Potem sprawdzić wersję tego poradnika, znalazłem różnicę.

W Java EE 7 wersja kodu email.xhtml jest jak następuje:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml" 
    xmlns:composite="http://xmlns.jcp.org/jsf/composite" 
    xmlns:h="http://xmlns.jcp.org/jsf/html"> 

<h:head> 
    <title>This content will not be displayed</title> 
</h:head> 
<h:body> 
    <composite:interface> 
     <composite:attribute name="value" required="false"/> 
    </composite:interface> 

    <composite:implementation> 
     <h:outputLabel value="Email id: "></h:outputLabel> 
     <h:inputText value="#{cc.attrs.value}"></h:inputText> 
    </composite:implementation> 
</h:body> 
</html> 

Ale w Java EE 6 wersji

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml" 
    xmlns:composite="http://java.sun.com/jsf/composite" 
    xmlns:h="http://java.sun.com/jsf/html"> 

<h:head> 
    <title>This content will not be displayed</title> 
</h:head> 
<h:body> 
    <composite:interface> 
     <composite:attribute name="value" required="false"/> 
    </composite:interface> 

    <composite:implementation> 
     <h:outputLabel value="Email id: "></h:outputLabel> 
     <h:inputText value="#{cc.attrs.value}"></h:inputText> 
    </composite:implementation> 
</h:body> 
</html> 

Po zmianie kodu Java EE 6 wersji , błąd zniknął. Różnica polega na przestrzeni nazw. Nie wiem, czy to jest problem z tego samouczka. Czy jest ktoś wie?

Odpowiedz

9

Sposób obsługi nowych przestrzeni nazw XML xmlns.jcp.org jest przerywany w pierwszych wydaniach Mojarra 2.2.0 i 2.2.1. Zostało to naprawione w Mojarra 2.2.2 (uwaga: bilet w łączu opisuje inny objaw problemu, ale pod osłonami jest to zasadniczo ta sama przyczyna). Zaleca się uaktualnienie do wersji co najmniej Mojarra 2.2.2 (zawsze wybierz najnowszą dostępną, jeśli to możliwe). GlassFish 4.0 zawiera pakiet 2.2.0. Możesz uzyskać JAR od javaserverfaces.java.net. Wszystko, co musisz zrobić, to zastąpić plik javax.faces.jar w folderze GlassFish o numerze /modules w nowszej wersji.

Samouczek Java EE 7 jest w porządku. To była tylko implementacja, która została złamana. Tego rodzaju kłopoty nie są niczym niezwykłym w przypadku pierwszego ważnego wydania GlassFish (wszystko, aby przygotować je na czas). Zalecam poczekanie z Java EE 7 do czasu wypuszczenia GlassFish 4.0.1 lub 4.1, aby uniknąć przyszłych niespodzianek. Zauważ, że inni dostawcy, tacy jak Apache Tomcat i JBoss AS, poświęcają swój czas na wydanie kontenera Java EE 7; nie mają jeszcze gotowej wersji produkcyjnej.

+0

Pobrałem jar Mojarra 2.2.2 z linku i umieściłem go w/modules. Ale wciąż mam ten sam problem. Myślę, że powinienem poczekać na GlassFish 4.1. W każdym razie, dziękuję za odpowiedź. – Chris

+2

Udało mi się odtworzyć Twój problem na niezmodyfikowanej konfiguracji GF4. Twój przypadek użycia zaczął działać dla mnie po aktualizacji z Mojarra 2.2.2. Czy wyczyściłeś foldery pracy/pamięci podręcznej/wdrożenia w GF4? Jak zarządzasz serwerem? Autonomiczny lub przez IDE? Zauważ, że generalnie nie zamieszczam odpowiedzi, jeśli sam nie potwierdziłem/nie doświadczyłem tego samego problemu. – BalusC

+0

Przepraszamy za pierwsze komentarze. Zapomniałem zmienić nazwę pliku jar, aby GlassFish wczytał go jako pierwszy. Teraz działa. Dzięki – Chris