在JSF 2.0中注入Bean

时间:2013-01-20 21:49:07

标签: java jsf-2 dependency-injection javabeans cdi

我有一个会话范围的bean

import javax.faces.bean.SessionScoped;
import javax.inject.Named;
@Named
@SessionScoped
public class SessionBean implements Serializable{

我在一个过滤器中对象进行了...

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());
}
}

但是,我在下一次互动中会使用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:抱歉我的英文!

2 个答案:

答案 0 :(得分:24)

您不能将您正在使用的两个软件包中的注释javax.faces.bean.SessionScoped用于JSF,而import javax.inject.Named用于CDI。两者都反映了不同的注射机制,不能在同一个豆上混合。您必须从同一个包中选择两个注释(对于Injection和Bean Scoping)。使用相应包中的以下集合

对于基于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中,您只能注入范围比其目标范围更广的bean。你可以将一个@SessionScoped bean注入一个@RequestScoped bean而不是相反的方式

但是由于不推荐使用JSF托管bean,因此最好使用CDI托管bean。在这种情况下,你可以在更广泛的范围内注入更短范围的bean

答案 1 :(得分:5)

忘记托管bean。它不适用于过滤器。如果您坚持使用它,请按照此处提供的答案正确执行:

How implement a login filter in JSF?

现在关于CDI,如果你遇到的问题是特定的值是null并且你已经通过实际获得NPE来验证这一点(因为例如Eclipse调试器有时会错误)。然后仔细检查你是否使用了kolossus所描述的正确的SessionScoped,并检查了BalusC所说的内容(beans.xml)。

查看CDI是否正常工作的一个好方法是向经理询问bean。将此调试代码放在某处并尝试:

@Inject
BeanManager manager;

@PostConstruct
private void test() {
    Bean<?> bean = (Bean) manager.resolve(manager.getBeans("ANY_NAMED_BEAN_EL_NAME"));
        System.out.println(bean);

}