当注入时,@SessionScoped CDI bean是一个不同的Instance。

问题描述 投票:4回答:3

我的config是一个Bean,我把它注入到我的代码中,只要我需要它。然而,当注入时,我得到的是一个新的Bean实例,而不是会话中的那个。

我的bean。

@Named
@SessionScoped
public class TestModel implements Serializable {

    private static final long serialVersionUID = 4873651498076344849L;

    private String version;

    public String getVersion() {
        return version;
    }

    public void setVersion(String version) {
        this.version = version;
    }

    public void changeVersion() {       
        this.version = "Version 2";
        System.out.println("New version : " + version + ", Object : " + this);
    }
}

当注入到不同的类中时,所有的实例都是不同的.当用@ApplicationScoped注解Bean时,它是同一个实例.

我确实需要Bean是@SessionScoped,因为每个用户都应该有自己的配置。

WebApp运行在TomEE 1.7.4上。

更新:我创建了一个新的项目来测试它,SessionScope工作了。现在我需要找出当前项目的问题所在,以便修复它。

Facets:

  • CDI 1.0
  • 动态网页模块3.0
  • Java 1.8
  • JSF 2.2 (MyFaces impl from TomEE)
  • JPA 2.1

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" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">
  <display-name>Project</display-name>
  <welcome-file-list>
    <welcome-file>index.jsp</welcome-file>
  </welcome-file-list>
  <context-param>
    <description>State saving method: 'client' or 'server' (=default). See JSF Specification 2.5.2</description>
    <param-name>javax.faces.STATE_SAVING_METHOD</param-name>
    <param-value>client</param-value>
  </context-param>
  <context-param>
    <param-name>javax.servlet.jsp.jstl.fmt.localizationContext</param-name>
    <param-value>resources.application</param-value>
  </context-param>
  <context-param>
    <param-name>primefaces.THEME</param-name>
    <param-value>omega</param-value>
  </context-param>
  <context-param>
    <param-name>javax.faces.PROJECT_STAGE</param-name>
    <param-value>Development</param-value>
  </context-param>
  <context-param>
    <param-name>javax.faces.FACELETS_SKIP_COMMENTS</param-name>
    <param-value>true</param-value>
  </context-param>
  <servlet>
    <servlet-name>Faces Servlet</servlet-name>
    <servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
    <load-on-startup>1</load-on-startup>
  </servlet>
  <servlet-mapping>
    <servlet-name>Faces Servlet</servlet-name>
    <url-pattern>*.xhtml</url-pattern>
  </servlet-mapping>
</web-app>

面孔配置.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>

beans.xml

    <?xml version="1.0" encoding="UTF-8"?>
<beans 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/beans_1_1.xsd"
       version="1.1" bean-discovery-mode="annotated">           
</beans>

有什么想法吗?

servlets javabeans cdi tomee
3个回答
2
投票

看起来你的测试没有成功。

testModel object = model.TestModel@689a6064
New version : Version 2, Object : model.TestModel@61606aa6

所以你更新了一个与session链接的实例不一样的实例(另一个没有重复使用同一个session的请求)


1
投票

你这样做是对的. 也就是说,从CDI的角度来看,你没有犯错,你想要的东西是完全合法的,应该可以正常工作(假设你解决了多个会话的问题,你做到了)。

我刚刚用我自己的一段代码试了一下,结果和预期的一样。你可以 在GitHub上查看. 样本和你的差不多。

但是我正在运行Wildfly 10,因此Weld 2.3也是它的附带版本(Weld是CDI的参考内涵)。当你在运行 包含OpenWebBeans的TomEE (另一个CDI实现).在我看来,你要么错过了一些TomEEOWB的特定配置(不现实的情况),要么更可能是发现了一个bug。

在我看来,你要么错过了一些TomEEOWB的特定配置(不现实的情况),要么,更有可能的是,你发现了一个错误。在任何情况下,如果我是你,我会尝试在他们的论坛上询问或在他们的 跟踪系统 因为,再一次,你的beanservlet设置没有任何问题。


0
投票

我们有 @SessionScope 注释在JSF & CDI中都有。请检查你在旧项目中使用的注解是来自JSF还是CDI。来自JSF & CDI的注释之间的差异。

© www.soinside.com 2019 - 2024. All rights reserved.