尝试将会话范围的bean注入请求范围的bean时,我遇到了一个问题。我在本文末尾加入了一个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>
答案 0 :(得分:2)
解决了我的问题。显然,这是由于错误设置的Liferay属性(private-session-attributes设置为false而不是true)。
可在此主题中找到更多信息:https://www.liferay.com/community/forums/-/message_boards/message/48105922。
答案 1 :(得分:0)
将@Scope("session")
更改为@SessionScoped
和@Scope("request")
到@RequestScoped