2014-03-13 68 views
1

我正在使用@ManagedBean並嘗試更改爲CDI @Named,因爲前一個將被棄用。javax.el.PropertyNotFoundException目標無法訪問,標識符'xxxController'解析爲空

只要我改變我的控制器類之一,使用CDI,我打了異常說控制器解析爲空。

我已經搜索了很多關於這個問題的帖子,儘可能多地閱讀,但是,目前爲止似乎沒有任何東西可以幫助我,請在我的情況下提供建議。 (也試圖刪除的lib/javax.inject-1.jar爲一體的職位建議,但沒有運氣。)

  1. 我得到了GF4在NB 7.4啓動。
  2. 部署我的應用程序沒有任何錯誤。
  3. 訪問頁面時沒有錯誤,除非所有變量文本都是空白的,因爲它們是在控制器中設置的,並且使用value =「#{xxxController.someText}」進行加載。
  4. 由於輸入變量是使用value =「#{userController.user.username}」like expression來設置的,所以我單擊提交按鈕並從控制檯日誌彈出null控制器錯誤。

ENV:

NetBeans 7.4 
Glassfish 4 
JDK 1.7 

POM:

<dependencies> 

<!-- MySQL Connector --> 
<dependency> 
    <groupId>mysql</groupId> 
    <artifactId>mysql-connector-java</artifactId> 
    <version>5.1.28</version> 
    <scope>provided</scope> 
</dependency> 

<!-- Hibernate --> 
<dependency> 
    <groupId>org.hibernate</groupId> 
    <artifactId>hibernate-core</artifactId> 
    <version>4.2.8.Final</version> 
</dependency> 
<dependency> 
    <groupId>org.hibernate</groupId> 
    <artifactId>hibernate-entitymanager</artifactId> 
    <version>4.2.8.Final</version> 
</dependency> 

<!-- JSF --> 
<dependency> 
    <groupId>org.glassfish</groupId> 
    <artifactId>javax.faces</artifactId> 
    <version>2.2.5</version> 
</dependency> 

<!-- JSTL --> 
<dependency> 
    <groupId>jstl</groupId> 
    <artifactId>jstl</artifactId> 
    <version>1.2</version> 
</dependency> 

<!-- PrimeFaces --> 
<dependency> 
    <groupId>org.primefaces</groupId> 
    <artifactId>primefaces</artifactId> 
    <version>4.0</version> 
</dependency> 
<dependency> 
    <groupId>org.primefaces.themes</groupId> 
    <artifactId>all-themes</artifactId> 
    <version>1.0.10</version> 
</dependency> 

<!-- Security --> 
<dependency> 
    <groupId>org.apache.shiro</groupId> 
    <artifactId>shiro-core</artifactId> 
    <version>1.2.3</version> 
</dependency> 
<dependency> 
    <groupId>org.apache.shiro</groupId> 
    <artifactId>shiro-web</artifactId> 
    <version>1.2.3</version> 
</dependency> 

<!-- Commons --> 
<dependency> 
    <groupId>org.apache.commons</groupId> 
    <artifactId>commons-lang3</artifactId> 
    <version>3.2.1</version> 
</dependency> 
<dependency> 
    <groupId>commons-logging</groupId> 
    <artifactId>commons-logging</artifactId> 
    <version>1.1.3</version> 
</dependency> 

<!-- CDI --> 
<dependency> 
    <groupId>javax.enterprise</groupId> 
    <artifactId>cdi-api</artifactId> 
    <version>1.1</version> 
</dependency> 

<!-- Logger --> 
<dependency> 
    <groupId>org.slf4j</groupId> 
    <artifactId>slf4j-api</artifactId> 
    <version>1.7.6</version> 
</dependency> 
<dependency> 
    <groupId>org.apache.logging.log4j</groupId> 
    <artifactId>log4j-api</artifactId> 
    <version>2.0-rc1</version> 
</dependency> 
<dependency> 
    <groupId>org.apache.logging.log4j</groupId> 
    <artifactId>log4j-core</artifactId> 
    <version>2.0-rc1</version> 
</dependency> 
<dependency> 
    <groupId>org.apache.logging.log4j</groupId> 
    <artifactId>log4j-slf4j-impl</artifactId> 
    <version>2.0-rc1</version> 
</dependency> 

的web.xml

<?xml version="1.0" encoding="UTF-8"?> 
<web-app xmlns="http://java.sun.com/xml/ns/javaee" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" 
version="3.0"> 

beans.xml中:

<?xml version="1.0" encoding="UTF-8"?> 
<beans xmlns="http://java.sun.com/xml/ns/javaee" 
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/beans_1_0.xsd"> 
</beans> 

faces-config.xml中

<?xml version="1.0" encoding="UTF-8"?> 
<faces-config xmlns="http://xmlns.jcp.org/xml/ns/javaee" 
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
       xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-facesconfig_2_2.xsd" 
       version="2.2"> 
</faces-config> 

控制器類看起來像:

import javax.enterprise.context.SessionScoped; 
import javax.inject.Named; 

@Named 
@SessionScoped 
public class UserController implements Serializable { 

XHTML主叫豆:

<h:outputText value="Username: " /> 
    <p:inputText value="#{userController.user.username}"> 
</p:inputText> 

行家文件夾結構,接着用:

WEB-INF 
--beans.xml 
--faces-config.xml 
--glassfish-web.xml 
--web.xml 

2014年3月14日: 發現控制器的構造函數在使用CDI時從未調用過。使用@ManagedBean時完全沒有問題。

+0

請發佈您的faces-config.xml文件的內容。 –

+0

補充說,感謝您的快速提醒。 – HxHxH

+0

找到使用CDI時從未調用過的控制器的構造函數。使用@ManagedBean時完全沒有問題。 – HxHxH

回答

-1

聽起來像你的'用戶'對象沒有正確實例。在你的控制器類試試這個在它的GET方法:

public User getUser() { 
    if (user == null) { 
     user = new User(); 
    } 
    return user; 
} 

希望這可以幫助你,如果不是,請發表您的都爲「用戶」的實體和DAO類。

+0

找到了使用CDI時從未調用過的控制器的構造函數。使用@ManagedBean時完全沒有問題。 – HxHxH

+0

吸氣劑應儘可能乾淨。您應該避免在託管的bean中存在任何邏輯。如果您需要初始化任何變量,請使用'@ PostConstruct'方法替代。 –

0

您是類路徑污染的受害者,並且面臨着針對非Java EE容器(例如Tomcat)的在線教程/示例的混淆。GlassFish是一個真正的Java EE容器,其中包含JSF和CDI,但您的pom.xml指示Maven將其他包與僅在非Java EE容器(例如Tomcat上)上必需的webapp捆綁在一起:

<!-- JSF --> 
<dependency> 
    <groupId>org.glassfish</groupId> 
    <artifactId>javax.faces</artifactId> 
    <version>2.2.5</version> 
</dependency> 

<!-- CDI --> 
<dependency> 
    <groupId>javax.enterprise</groupId> 
    <artifactId>cdi-api</artifactId> 
    <version>1.1</version> 
</dependency> 

這是不對的。這將在運行時類路徑中以重複的JSF和CDI庫結束,它們只會相互衝突,並將問題作爲其中一個後果。

您需要將它們標記爲<scope>provided</scope>,這應該告訴Maven目標環境(在您的情況下:GlassFish)已經將它們捆綁在一起,以便Maven不會將它們捆綁到WAR中。

<!-- JSF --> 
<dependency> 
    <groupId>org.glassfish</groupId> 
    <artifactId>javax.faces</artifactId> 
    <version>2.2.5</version> 
    <scope>provided</scope> 
</dependency> 

<!-- CDI --> 
<dependency> 
    <groupId>javax.enterprise</groupId> 
    <artifactId>cdi-api</artifactId> 
    <version>1.1</version> 
    <scope>provided</scope> 
</dependency> 

順便說一句,同樣的問題也適用於JSTL依賴,但這超出了問題的範圍。 (JSF,CDI和JSTL),並指定完整提供的Java EE web配置文件依賴關係(其中還包括另一個Java EE awesomeness,如EJB和JPA)。

<!-- Java EE 7 web profile --> 
<dependency> 
    <groupId>javax</groupId> 
    <artifactId>javaee-web-api</artifactId> 
    <version>7.0</version> 
    <scope>provided</scope> 
</dependency> 

這樣您就不需要將每個已捆綁的Java EE工件單獨聲明爲編譯時間依賴性。

相關問題