7

我有一份工作@ManagedBean,我想用@Named + @RequestScoped豆子代替。

// 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/

4

4 回答 4

2

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

于 2012-06-13T18:02:45.043 回答
2

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

无论如何,我猜测使@Named 工作的“真正”方法是:如果您导入正确的@RequestScoped 注释,@Named 将起作用;来自 javax.enterprise.context 包。javax.faces.bean 包中的@RequestScoped 注释与@Named 注释不兼容。如果你在@Named 旁边省略了正确的@RequestScoped,bean 将会触发,但它不会读取任何属性。

附言。我使用 Glassfish,所以我怀疑这是 JBoss 的问题。

于 2012-11-07T12:15:37.493 回答
1

我认为您要么不在这些场景之一,要么JBoss AS 7 有另一个类似这样的问题。

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

于 2012-06-13T08:20:56.783 回答
-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
于 2014-09-15T21:37:22.333 回答