5

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

4

2 回答 2

30

您不能混合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

于 2013-01-20T22:10:47.270 回答
5

忘记托管bean。它不会以这种方式与过滤器一起使用。如果您坚持使用它,请按照此处提供的答案正确执行:

如何在 JSF 中实现登录过滤器?

现在关于 CDI,如果您的问题是某个特定值是 null 并且您已经通过实际获取 NPE 左右来验证这一点(例如,Eclipse 调试器有时会出错)。然后仔细检查您是否使用了正确的 SessionScoped,如 kolossus 所述,并检查 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);

}
于 2013-01-21T18:52:58.313 回答