在JSF 2.0注入豆(Injecting Beans in JSF 2.0)

2019-07-18 11:41发布

我有一个会话范围豆

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:对不起,我的英语!

Answer 1:

你不能从你使用这两个包混合注释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管理的。 在这种情况下,你可以注入在更广泛的范围的那些短作用域豆



Answer 2:

忘记管理的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);

}


文章来源: Injecting Beans in JSF 2.0