Jakarta ee @ManagedBean注释不起作用,但@Named起作用
我遇到了一些麻烦。 使用@Named works初始化:Jakarta ee @ManagedBean注释不起作用,但@Named起作用,jakarta-ee,spring-mvc,jsf-2,cdi,Jakarta Ee,Spring Mvc,Jsf 2,Cdi,我遇到了一些麻烦。 使用@Named works初始化: @Named @SessionScoped public class UserBean { @Autowired UserBo userBo; public void setUserBo(UserBo userBo) { this.userBo = userBo; } public String printMsgFromSpring() { return userBo.getMessage(); } } 但这是无
@Named
@SessionScoped
public class UserBean {
@Autowired
UserBo userBo;
public void setUserBo(UserBo userBo) {
this.userBo = userBo;
}
public String printMsgFromSpring() {
return userBo.getMessage();
}
}
但这是无效的,并会产生错误:
javax.servlet.ServletException
javax.faces.webapp.FacesServlet.service(FacesServlet.java:606)
根本原因
java.lang.NullPointerException
printMsgFromSpring(UserBean.java:24)
xhtml页面:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://java.sun.com/jsf/html">
<h:body>
<h1>JSF 2.0 + Spring Example</h1>
#{userBean.printMsgFromSpring()}
</h:body>
web.xml:
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
id="WebApp_ID" version="2.5">
<display-name>JavaServerFaces</display-name>
<!-- Add Support for Spring -->
<listener>
<listener-class>
org.springframework.web.context.ContextLoaderListener
</listener-class>
</listener>
<listener>
<listener-class>
org.springframework.web.context.request.RequestContextListener
</listener-class>
</listener>
<welcome-file-list>
<welcome-file>default.xhtml</welcome-file>
</welcome-file-list>
<servlet>
<servlet-name>facesServlet</servlet-name>
<servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>facesServlet</servlet-name>
<url-pattern>*.xhtml</url-pattern>
</servlet-mapping>
</web-app>
JavaServerFaces
org.springframework.web.context.ContextLoaderListener
org.springframework.web.context.request.RequestContextListener
default.xhtml
小脸蛋
javax.faces.webapp.FacesServlet
1.
小脸蛋
*.xhtml
applicationContext.xml:
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.1.xsd">
<context:component-scan base-package="com.mkyong" />
</beans>
你做了一些我认为是错误的假设。Spring可以读取
@Named
和Inject
注释,但我怀疑您的JSF DI容器是否可以读取自动连接的
注释。在这种情况下
@Named
@SessionScoped
public class UserBean {
@Autowired
UserBo userBo;
public void setUserBo(UserBo userBo) {
this.userBo = userBo;
}
public String printMsgFromSpring() {
return userBo.getMessage();
}
}
我相信Spring正在创建一个UserBean
实例(因为@Named
),并注入一个UserBo
bean(它也来自@Named
类)。Spring忽略已处理的会话
但在这种情况下,
@ManagedBean
@SessionScoped
public class UserBean {
@Autowired
UserBo userBo;
public void setUserBo(UserBo userBo) {
this.userBo = userBo;
}
public String printMsgFromSpring() {
return userBo.getMessage();
}
}
我相信您的JSF容器正在创建这个bean,但不知道什么是@Autowired
,所以不处理它,它会忽略它
如果您向我们展示了您的Spring上下文配置以及上述bean的来源,我的答案会更清楚。您做出了一些我认为是错误的假设。Spring可以读取
@Named
和Inject
注释,但我怀疑您的JSF DI容器是否可以读取自动连接的
注释。在这种情况下
@Named
@SessionScoped
public class UserBean {
@Autowired
UserBo userBo;
public void setUserBo(UserBo userBo) {
this.userBo = userBo;
}
public String printMsgFromSpring() {
return userBo.getMessage();
}
}
我相信Spring正在创建一个UserBean
实例(因为@Named
),并注入一个UserBo
bean(它也来自@Named
类)。Spring忽略已处理的会话
但在这种情况下,
@ManagedBean
@SessionScoped
public class UserBean {
@Autowired
UserBo userBo;
public void setUserBo(UserBo userBo) {
this.userBo = userBo;
}
public String printMsgFromSpring() {
return userBo.getMessage();
}
}
我相信您的JSF容器正在创建这个bean,但不知道什么是@Autowired
,所以不处理它,它会忽略它
如果您向我们展示了您的Spring上下文配置以及上述bean的来源,我的答案会更清楚。JSF不会处理
@Autowired
。应将其替换为@ManagedProperty
,如下例所示:
@ManagedProperty(value="#{userBoSpringName}")
UserBo userBo;
这里的userBoSpringName
应该与spring上下文文件中的bean名称相对应。
此选项仅在JSF托管bean中可用
从JSF2.2开始,您还可以在JSF管理的bean中使用
@Inject
来执行资源注入JSF不会处理@Autowired
。应将其替换为@ManagedProperty
,如下例所示:
@ManagedProperty(value="#{userBoSpringName}")
UserBo userBo;
这里的userBoSpringName
应该与spring上下文文件中的bean名称相对应。
此选项仅在JSF托管bean中可用
从JSF 2.2开始,您也可以在JSF管理的bean中使用
@Inject
来执行资源注入请发布您的spring上下文。Thx,我将applicationContext.xml添加到我的postPlace发布您的spring上下文。Thx,我将applicationContext.xml添加到我的postBig Thx,我尝试使用Inject注释,但是我不知道它只在JSF2.2中工作。此外,我还尝试使用组件注释而不是ManagedBean,所有这些都奏效了。我还尝试使用组件注释而不是ManagedBean,而且所有worked.JSF都不处理Spring注释,因此这种方法将失败。通常,您将Spring配置为处理JSF管理的bean,或者停止使用Spring并移动到CDI来解决此问题。@LuiggiMendoza是的,Spring知道并处理@Named
,就好像它是@Component
一样。它不处理@SessionScoped
。另一方面,JSF不知道@Autowired
,因此字段保持null
。JSF不处理Spring注释,因此这种方法将失败。通常,您将Spring配置为处理JSF管理的bean,或者停止使用Spring并移动到CDI来解决此问题。@LuiggiMendoza是的,Spring知道并处理@Named
,就好像它是@Component
一样。它不处理@SessionScoped
。另一方面,JSF不知道@Autowired
,因此该字段保持null
。