我正在使用@ManagedBean并尝试更改为CDI @Named,因为前者将被弃用。
一旦我将我的一个控制器类更改为使用CDI,我就会遇到异常,说控制器被解析为null。
我已经搜索了很多关于这个问题的帖子,尽可能多地阅读,但是,到目前为止似乎没有什么可以帮助我,请在我的案例中提出建议。 (也尝试删除lib / javax.inject-1.jar作为帖子之一,但没有运气。)
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时完全没问题。
答案 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;