在JSF 2.0中注入Bean


问题内容

我有一个会话范围的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:对不起,我的英语!


问题答案:

您不能将javax.faces.bean.SessionScoped用于JSF和import javax.inject.NamedCDI的这两个包中的注释混合在一起。两者都反映了不同的注入机制,因此不能在同一bean上混合使用。您必须从同一程序包中选择两个注解(用于注入和Bean范围限定)。使用以下对应套件中的套件

对于基于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,例如,可以将@SessionScopedbean注入@RequestScopedbean中,而不能以其他方式注入

但是由于不建议使用JSF托管bean,因此最好使用CDI托管bean。在这种情况下,您 可以 将范围较小的Bean注入范围较大的Bean