在JSF 2.0中注入Bean
我有一个Session scoped bean
import javax.faces.bean.SessionScoped; import javax.inject.Named; @Named @SessionScoped public class SessionBean implements Serializable{
我在一个filter中使用了对象…
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
for JSF的两个包中的注释,并为CDI import javax.inject.Named
。 两者都反映了不同的注射机制,不能在同一个豆上混合。 您必须从同一个包中选择两个注释(对于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。 它不适用于filter。 如果您坚持使用它,请按照此处提供的答案正确执行:
如何在JSF中实现登录filter?
现在关于CDI,如果你问题是一个特定的值是null并且你已经通过实际获得NPE左右来validation这一点(因为例如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); }