@Named + @RequestScoped在JBoss 7.1.1的JSF 2.0中不起作用

时间:2012-06-12 15:11:23

标签: java-ee jsf-2 cdi

我有一个工作@ManagedBean,我想用@Named + @RequestScoped bean代替。

// Before
@ManagedBean
public class Login {
   ...
}

// After
import javax.enterprise.context.RequestScoped;
@Named
@RequestScoped
public class Login {
   ...
}

只要我使用@ManagedBean,一切正常。没有@Named的{​​{1}}可以正常工作,但会为每个EL表达式创建一个新实例。 @RequestScoped会产生异常:请求缓存无效时无法添加请求范围的缓存项

@Named + @RequestScoped

java.lang.IllegalStateException: Unable to add request scoped cache item when request cache is not active at org.jboss.weld.context.cache.RequestScopedBeanCache.addItem(RequestScopedBeanCache.java:51) at de.prosis.dafe.presentation.Login$Proxy$_$$_WeldClientProxy.getUsername(Login$Proxy$_$$_WeldClientProxy.java) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) at java.lang.reflect.Method.invoke(Method.java:597) at javax.el.BeanELResolver.getValue(BeanELResolver.java:302) at com.sun.faces.el.DemuxCompositeELResolver._getValue(DemuxCompositeELResolver.java:176) at com.sun.faces.el.DemuxCompositeELResolver.getValue(DemuxCompositeELResolver.java:203) at org.apache.el.parser.AstValue.getValue(AstValue.java:169) at org.apache.el.ValueExpressionImpl.getValue(ValueExpressionImpl.java:189) at org.jboss.weld.el.WeldValueExpression.getValue(WeldValueExpression.java:50) at com.sun.faces.facelets.el.TagValueExpression.getValue(TagValueExpression.java:109) at javax.faces.component.ComponentStateHelper.eval(ComponentStateHelper.java:194) ... 确实存在。是否有任何我不知道的陷阱或错误?我打赌我错过了一些东西,但它确实看起来像一个bug。我搜索了异常消息,但除了引发它的类的源代码之外没有找到任何东西。提前谢谢!

更新 它与我省略的代码有关。登录bean尝试在其构造函数中使会话无效,如果它是一个命名bean(不总是,如果我垃圾邮件F5,它似乎在几次后工作)就会失败并且作为托管bean工作。有人可以解释这种行为吗?

beans.xml

代码来自该教程: http://www.greenkode.com/2011/09/user-authentication-and-authorization-using-jaas-and-servlet-3-0-login/

4 个答案:

答案 0 :(得分:2)

通过删除构造函数中会话的失效来解决此问题。我仍然不知道为什么@ManagedBean有效而@Named没有。

答案 1 :(得分:2)

我遇到了同样的问题。从@ManagedBean(正在工作)切换到@Named但无法正常工作。我在WEB-INF中有一个beans.xml文件,并没有像大多数人所说的那样解决问题。您可以添加@Stateless和@Named以使其工作原因我不知道!如果有人能解释我会喜欢听到它。

无论如何,我猜测@Named工作的“真实”方式是这样的: 如果导入正确的@RequestScoped注释,则@Named将起作用;来自javax.enterprise.context包。来自javax.faces.bean包的@RequestScoped注释与@Named注释不兼容。如果省略正确的@RequestScoped与@Named一起,bean将会触发,但它不会读取任何属性。这是一个非常晚的回复,但我希望这有助于其他任何人对此感到恼火。

PS。我使用Glassfish所以我怀疑它是JBoss的问题。

艾伦

答案 2 :(得分:1)

我认为您要么是{{3>}场景之一 ,要么JBoss AS 7还有其他问题,例如these个问题。

BTW,请求范围的bean不需要可序列化。可能@SteveTaylor将它与会话范围的bean混合在一起。

答案 3 :(得分:-1)

对于仍在与这个问题作斗争的人来说,这对我有用(原因仍然模糊不清)

我将GF4与netbeans一起使用。 Netbeans在JSF页面中也有一个很好的tabcompletion,它与注入不一致。我测试(目前)只有请求范围,但我把它全部放在包中..

所以这里是我使用的所有组合,结果(最重要的是解决方案)

最佳解决方案

import javax.faces.bean.RequestScoped; 
import javax.inject.Named; 
//=> Injection ok - Tab Completion OK

其他较少或不足的组合(信息)

import javax.faces.bean.RequestScoped;
import javax.annotation.ManagedBean; 
//=> Injection ok - Tab Completion NOK

import javax.enterprise.context.RequestScoped;
import javax.inject.Named; 
//=> Injection nok - Tab Completion OK 


import javax.enterprise.context.RequestScoped;
import javax.faces.bean.ManagedBean;
//=> Injection nok - Tab Completion OK 


import javax.faces.bean.RequestScoped;
import javax.faces.bean.ManagedBean;
//=> Injection nok - Tab Completion OK


import javax.enterprise.context.RequestScoped;
import javax.annotation.ManagedBean; 
//=> Injection nok - Tab Completion NOK