Java 在JSF2.0中注入bean
我有一个会话范围的beanJava 在JSF2.0中注入bean,java,jsf-2,dependency-injection,javabeans,cdi,Java,Jsf 2,Dependency Injection,Javabeans,Cdi,我有一个会话范围的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 session
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
)相同
谢谢
对不起我的英语 您不能将JSF使用的
javax.faces.bean.SessionScoped
和CDI使用的import javax.inject.Named
这两个包中的注释混合使用。两者反映了不同的注入机制,不能在同一个bean上混合。您必须从同一个包中选择两个注释(用于注入和Bean作用域)。使用相应软件包中的以下集合
用于基于CDI的bean定义
javax.enterprise.context.SessionScoped //for bean scoping
javax.inject.Named //for bean declaration
javax.inject.Inject //for injection
javax.faces.bean.SessionScoped //for bean scoping
javax.faces.bean.ManagedBean //for bean declaration
javax.faces.bean.ManagedProperty //for bean injection
用于基于JSF的bean定义
javax.enterprise.context.SessionScoped //for bean scoping
javax.inject.Named //for bean declaration
javax.inject.Inject //for injection
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注入范围较广的bean中。这样的过滤器不起作用。如果您坚持使用,请按照此处提供的答案正确操作: 现在关于CDI,如果您的问题是一个特定的值为null,并且您已经通过实际获取一个NPE或其他值来验证了这一点(例如,Eclipse调试器有时会获取错误的值)。然后再次检查您是否使用了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);
}
@Inject
豆管经理;
@施工后
专用无效测试(){
Bean=(Bean)manager.resolve(manager.getBeans(“任何名为Bean的名称”);
System.out.println(bean);
}
你好,我试过了。但这不管用。我导入javax.faces.bean.sessionScope与javax.faces.bean.ManagedBean。我使用javax.inject.Named导入import javax.inject.Named,但是当我设置一个值时,bean不会更改属性。谢谢。@JuanPabloGómezulibe,您不能对JSFbean使用@Inject
@inject
仅适用于CDI上下文中的bean。对于JSF下的bean,使用@ManagedProperty
。见更新的回复,谢谢回复。我使用基于JSF的bean定义进行了验证,并尝试使用@ManagedProperty(value=“#{SessionBean}”)注入bean SessionBean,但这被注入为null(bean已设置并获取)。并使用基于反CDI的方法解决初始问题。谢谢。@JuanPabloGómezulibe你的环境是什么(JSF版本和应用服务器)?嗨,JSF 2.0和GlassFish 3.1只有当你有一个/WEB-INF/beans.xml
文件时,这个文件才有效(当你选择CDI方面时,稍微正常的IDE会自动生成这个文件,或者如果你读过教程,在稍微正常的CDI教程中已经提到过)。你有这个文件吗?嗨,谢谢你的回复。如果你想的话,我试试看。我更喜欢CDI,我同意@KarlKildén。。如果我们有CDIBeans,为什么要使用JSF托管bean