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

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

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

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

一切正常,只要我使用@ManagedBean@Named没有@RequestScoped作品,但为每个EL表达式创建一个新的实例。 @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)
    ...

空的beans.xml确实存在。 是否有任何我不知道的陷阱或错误? 我敢打赌,我错过了一些东西,但它确实看起来像一个错误。 我搜索了异常消息,但除了引发它的类的来源之外没有发现任何东西。 提前致谢!

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

public Login() {
            HttpSession session = (HttpSession) FacesContext.getCurrentInstance().getExternalContext().getSession(false);
            if (session != null) {
                session.invalidate();
            }
} 

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


通过删除构造函数中的会话失效来修复它。 我仍然不知道为什么@ManagedBean工作,@Named不工作。


我有同样的问题。 从@ManagedBean(正在工作)切换到@Named,这不起作用。 我在WEB-INF中有一个beans.xml文件,它并不像大多数人所说的那样解决问题。 您可以将@Stateless与@Named一起添加,以使其工作原因我不知道! 如果有人能解释我很乐意听到它。

无论如何,我猜测@Named工作的'真正'方法是这样的:如果你导入了正确的@RequestScoped注解,@Named将会起作用; 来自javax.enterprise.context包。 来自javax.faces.bean包的@RequestScoped注释与@Named注释不兼容。 如果你忽略了@Name的正确@RequestScoped,这个bean将会触发,但它不会读取任何属性。 这是一个非常晚的答复,但我希望它可以帮助其他人对此感到兴奋。

PS。 我使用Glassfish,所以我怀疑这是一个JBoss问题。

艾伦


我认为你不在这些场景之中,或者说JBoss AS 7有另一个类似的问题。

顺便说一句,请求范围的bean不需要可序列化。 可能@SteveTaylor将它与会话范围的bean混合使用。

链接地址: http://www.djcxy.com/p/60609.html

上一篇: @Named + @RequestScoped not working in JSF 2.0 with JBoss 7.1.1

下一篇: Difference between .NET and PHP encryption