Java 在JSF2.0中注入bean

Java 在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

我有一个会话范围的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
)相同

谢谢


对不起我的英语

您不能将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