Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/spring-mvc/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Jakarta ee @ManagedBean注释不起作用,但@Named起作用_Jakarta Ee_Spring Mvc_Jsf 2_Cdi - Fatal编程技术网

Jakarta ee @ManagedBean注释不起作用,但@Named起作用

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 works初始化:

@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