我有一个会话范围豆
import javax.faces.bean.SessionScoped;
import javax.inject.Named;
@Named
@SessionScoped
public class SessionBean implements Serializable{
我inyect的目的是在一个过滤器...
public class FiltroSeguridad implements Filter{
@Inject
private SessionBean sessionBean;
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
HttpServletRequest httpRequest = (HttpServletRequest) request;
sessionBean.setRutaRedirect(httpRequest.getRequestURI());
}
}
但是,我inyect的SessionBean在接下来的互动...
@Model
public class CuentaUsuarioWebBean implements Serializable{
@Inject
private SessionBean sessionBean;
public void loginUsuario() throws IOException{
sessionBean.getRutaRedirect();
}
}
但物业getRutaRedirect()
返回null
我通过CDI注解它仍然无法正常工作(改进口javax.enterprise.context.SessionScoped
),同样与JSF注释( javax.faces.bean.ManagedBean
和@ManagedProperty
)。
谢谢。
PD:对不起,我的英语!
你不能从你使用这两个包混合注释javax.faces.bean.SessionScoped
为JSF和import javax.inject.Named
的CDI。 这两种反映不同注射的机制,不能在同一豆混合。 你必须选择从同一个包中同时标注(注射和豆作用域)。 从他们相应的软件包使用以下几组
对于基于CDI-bean定义
javax.enterprise.context.SessionScoped //for bean scoping
javax.inject.Named //for bean declaration
javax.inject.Inject //for injection
对于基于JSF的bean定义
javax.faces.bean.SessionScoped //for bean scoping
javax.faces.bean.ManagedBean //for bean declaration
javax.faces.bean.ManagedProperty //for bean injection
编辑:现在我明白你的要求更好,使用下面的结构中注入JSF托管bean
@ManagedProperty(value="#{yourBeanName}")
SessionBean yourSessionBean;
还要注意的是JSF中,你可以注入更大范围的只有豆比自己的目标,例如你可以注入一个@SessionScoped
豆成@RequestScoped
豆,而不是周围的其他方法
但由于JSF管理bean被弃用,最好使用CDI管理的。 在这种情况下,你可以注入在更广泛的范围的那些短作用域豆
忘记管理的bean。 它不会有一个过滤器的工作方式。 如果你坚持使用它,然后做正确的遵循此处给出了答案:
如何实现在JSF登录过滤器?
现在关于CDI,如果你的问题是一个特定的值是零,你已经通过实际得到一个NPE左右验证了这一点(由于例如Eclipse调试器有时会是错了)。 然后仔细检查你使用正确的SessionScoped喜欢通过kolossus描述,并检查BalusC说(beans.xml文件)的内容。
一个好办法,看看是否CDI工作是要求经理豆。 将这个调试代码的地方,并尝试:
@Inject
BeanManager manager;
@PostConstruct
private void test() {
Bean<?> bean = (Bean) manager.resolve(manager.getBeans("ANY_NAMED_BEAN_EL_NAME"));
System.out.println(bean);
}