我可以在托管bean Java类中使用@Component
而不是@ManagedBean
。
当我使用@ManagedBean
并对ManagedBean中的对象使用@Autowired
注释时,我在对象中获得null值。如果我使用@Controller
我不会遇到这个问题
@Component
@Scope("session")
public class OwnerListBean implements Serializable{
private static final long serialVersionUID = 3237148505293593526L;
OwnerService ownerService;
public OwnerService getOwnerService() {
return ownerService;
}
@Autowired
public void setOwnerService(OwnerService ownerService) {
this.ownerService = ownerService;
}
}
以上代码有效。
@ViewScoped
@ManagedBean
public class OwnerListBean implements Serializable{
private static final long serialVersionUID = 3237148505293593526L;
OwnerService ownerService;
public OwnerService getOwnerService() {
return ownerService;
}
@Autowired
public void setOwnerService(OwnerService ownerService) {
this.ownerService = ownerService;
}
}
在上面的代码中,对象ownerService
为null
。
答案 0 :(得分:1)
这真的让我想起CDI / Weld被引入核心Java规范时发生了什么,而且JSF已经拥有了自己的依赖注入实现。这两个规范基本上是同时开发的,并且是孤立的,导致了重大的功能重叠。
最初,答案是一个名为SEAM的框架,顾名思义,它是WELD的一种附加组件,它具有合并CDI和JSF DI世界的功能。该项目已被逐步吸收到J2EE 7,JSF 2.2和Apache Deltaspike项目中。
您在这里遇到类似的问题,您可能需要做的是以通用方式在JSF和Spring命名空间之间找到或构建桥梁。否则,您只需要选择其中一个。除非您真的需要JSF范围,否则我强烈建议您选择另一个(Spring),即使您确实需要JSF范围,也只需在Spring中重新实现它们。
我个人更喜欢Weld,但我不能责怪任何人使用Spring生态系统,它非常丰富,并且几乎肯定会替换JSF DI系统将提供的任何东西。
答案 1 :(得分:0)
@Autowired
是一个特定于Spring的注释。它只适用于Spring托管bean,即@Component
或@Controller
的bean。
或者,您可以将@ManagedBean
与@ManagedProperty
一起使用。默认情况下,您无法将Spring bean定义为ManagedProperty。但Spring提供了一个集成,允许在ManagedBean中引用Spring bean:SpringBeanFacesELResolver
使用此ELResolver,您应该能够执行以下操作:
@ViewScoped
@ManagedBean
public class OwnerListBean implements Serializable{
@ManagedProperty(value = "#{ownerService}")
OwnerService ownerService;
...
}