javax.el.PropertyNotFoundException目标无法访问,标识符' xxxController'解析为null

时间:2014-03-13 16:19:21

标签: maven jsf cdi jsf-2.2 glassfish-4

我正在使用@ManagedBean并尝试更改为CDI @Named,因为前者将被弃用。

一旦我将我的一个控制器类更改为使用CDI,我就会遇到异常,说控制器被解析为null。

我已经搜索了很多关于这个问题的帖子,尽可能多地阅读,但是,到目前为止似乎没有什么可以帮助我,请在我的案例中提出建议。 (也尝试删除lib / javax.inject-1.jar作为帖子之一,但没有运气。)

  1. 我在NB 7.4中启动了GF4。
  2. 部署我的应用程序时没有任何错误。
  3. 访问页面没有错误,除了所有变量文本都是空白的,因为它们是在控制器中设置并使用值="#{xxxController.someText}"加载。
  4. 我点击提交按钮,由于输入变量是使用value ="#{userController.user.username}"设置的,因此从控制台日志中弹出空控制器错误。喜欢表达。
  5. 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调用bean:

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

    maven文件夹结构后跟:

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

    2014年3月14日: 发现在使用CDI时从未调用的控制器构造函数。使用@ManagedBean时完全没问题。

2 个答案:

答案 0 :(得分:0)

您是类路径污染的受害者,并且与针对非Java EE容器(如Tomcat)的在线教程/示例混淆。 GlassFish是一个真正的Java EE容器,它已经捆绑了JSF和CDI,但你的pom.xml指示Maven将另一个与webapp捆绑在一起,这只是在非Java EE容器上必需的,例如Tomcat的:

<!-- 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实用程序,例如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工件单独声明为编译时依赖项。

答案 1 :(得分:-1)

听起来像您的用户&#39;对象未正确实例化。在控制器类中使用它的GET方法:

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

希望这可以帮助您,如果没有,请将您的实体和DAO课程发布给用户&#39;