我正在使用@ManagedBean,并尝试更改为CDI @Named,因为前一个将被弃用。
一旦我改变我的一个控制器类使用CDI,我遇到异常说控制器被解析为null。
我已经在谷歌上搜索了很多关于这个问题的帖子,尽可能多地阅读,然而,到目前为止似乎没有什么可以帮助我,请对我的情况提出建议。(也试图删除lib/javax.inject-1.jar作为一个帖子建议,但没有运气。)
- 我在NB 7.4中启动了GF4。
- 部署我的应用程序没有任何错误。
- 访问页面没有错误,除了所有的变量文本都是空白的,因为它们是在控制器中设置的,并使用value="#{xxxController.someText}"加载
- 我点击提交按钮,空控制器错误从控制台日志弹出,由于输入变量设置使用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类都贴出来。