我可以使用与spring集成的jsf在Web应用程序中的JSF托管bean中使用@Controller而不是@ManagedBean

时间:2014-02-12 07:49:32

标签: spring jsf

我可以在托管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;
    }

}

在上面的代码中,对象ownerServicenull

2 个答案:

答案 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;

    ...
}