将会话 bean 注入请求 bean 重新部署问题

Injecting session bean into request bean redeploy problems

我 运行 在尝试将会话范围的 bean 注入请求范围的 bean 时遇到了问题。我在这个 post 的末尾包含了一个 MWE,并试图找出模块停止工作的确切情况。

我第一次使用注入的会话范围 bean 部署模块(实际上是一个 Liferay portlet)时,一切都按预期进行。我可以随心所欲地重新部署,它似乎一直在工作,直到我真正让容器创建 bean 和会话。从那时起,每次重新部署时都会出现以下异常:

Caused by: java.lang.IllegalArgumentException: Can not set com.test.sessionscope.TestSessionBean field com.test.sessionscope.TestBean.bean to com.test.sessionscope.TestSessionBean

注入和作用域是使用 Spring 完成的,使用的 servlet 容器是 Tomcat。

一个最小的(不总是)工作示例:

TestSessionBean

@Named
@Scope("session")
public class TestSessionBean implements Serializable {

}

TestBean

@Named
@Scope("request")
public class TestBean implements Serializable {

    @Inject private TestSessionBean bean;

    private String name;

    @PostConstruct
    public void init() {
        name = "session test";
    }

    public String getName() {
        return name;
    }
}

XHTML

<f:view xmlns="http://www.w3.org/1999/xhtml" xmlns:f="http://java.sun.com/jsf/core" xmlns:h="http://java.sun.com/jsf/html">
    <h:head>
    </h:head>
    <h:body>
        #{testBean.name}
    </h:body>
</f:view>

@Scope("session")更改为@SessionScoped

@Scope("request")@RequestScoped

解决了我的问题。显然这是由于错误设置了 Liferay-属性(private-session-attributes 被设置为 false 而不是 true)。

更多信息可以在这个线程中找到:https://www.liferay.com/community/forums/-/message_boards/message/48105922