javax.el.PropertyNotFoundException Target Unreachable,标识符"xxxController"解析为空



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

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

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

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

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">

它指明:

<?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时完全没有问题。

您是类路径污染的受害者,并且对针对非java EE容器(如Tomcat)的在线教程/示例感到困惑。GlassFish是一个真正的Java EE容器,它已经捆绑了其他JSF和CDI,但是你的pom.xml指示Maven将另一个与web应用捆绑在一起,这只需要在非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工件单独声明为编译时依赖项。

听起来你的'user'对象没有正确实例化。在你的控制器类的GET方法中试试:

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

希望这对你有帮助,如果没有,请把你的实体和DAO类都贴出来。

相关内容

  • 没有找到相关文章

最新更新