Jua*_*ibe 5 java dependency-injection javabeans cdi jsf-2
我有一个Session scoped bean
import javax.faces.bean.SessionScoped;
import javax.inject.Named;
@Named
@SessionScoped
public class SessionBean implements Serializable{
Run Code Online (Sandbox Code Playgroud)
我在一个过滤器中进行了对象...
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());
}
}
Run Code Online (Sandbox Code Playgroud)
但是,我在下一次互动中使用SessionBean ...
@Model
public class CuentaUsuarioWebBean implements Serializable{
@Inject
private SessionBean sessionBean;
public void loginUsuario() throws IOException{
sessionBean.getRutaRedirect();
}
}
Run Code Online (Sandbox Code Playgroud)
但该属性getRutaRedirect()返回null
我通过CDI注释更改导入它仍然不起作用(javax.enterprise.context.SessionScoped),与JSF注释相同(javax.faces.bean.ManagedBean和@ManagedProperty).
谢谢.
PD:对不起我的英文!
kol*_*sus 26
您不能混合您javax.faces.bean.SessionScoped用于JSF和import javax.inject.NamedCDI的两个包中的注释.两者都反映了不同的注射机制,不能在同一个豆上混合.您必须从同一个包中选择两个注释(对于Injection和Bean Scoping).使用相应包中的以下集
对于基于CDI的bean定义
javax.enterprise.context.SessionScoped //for bean scoping
javax.inject.Named //for bean declaration
javax.inject.Inject //for injection
Run Code Online (Sandbox Code Playgroud)
对于基于JSF的bean定义
javax.faces.bean.SessionScoped //for bean scoping
javax.faces.bean.ManagedBean //for bean declaration
javax.faces.bean.ManagedProperty //for bean injection
Run Code Online (Sandbox Code Playgroud)
编辑:现在我更好地理解您的要求,使用以下构造来注入JSF托管bean
@ManagedProperty(value="#{yourBeanName}")
SessionBean yourSessionBean;
Run Code Online (Sandbox Code Playgroud)
另请注意,在JSF中,您只能注入范围比目标范围更广的bean,例如,您可以将@SessionScopedbean注入@RequestScopedbean而不是相反的方式
但由于不推荐使用JSF托管bean,因此最好使用CDI托管bean.在这种情况下,您可以在更宽的范围内注入更短的范围豆
忘记托管bean.它不适用于过滤器.如果您坚持使用它,请按照此处提供的答案正确执行:
现在关于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);
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
22787 次 |
| 最近记录: |