spring - jsf 2.0 spring 3 范围请求不起作用

标签 spring jsf-2

我正在尝试使用 spring 为 jsf 提供托管 bean。我假设 @ManagedBean 将被 JSF 容器拾取以将 JSF 中的 EL 链接到托管 bean,即使我通过在 faces-config.xml 中配置 spring 使用来使用 spring。

Spring 将提供 bean 但现在 谁管理 bean 的范围?

我尝试在 bean 上进行注释以使其成为请求范围,但它们不起作用。

@ManagedBean(name="helloBean") //meant for JSF
@RequestScoped //meant for JSF
@Scope(value="request") //meant for spring
@Controller //meant for spring
public class HelloBean implements Serializable {

实际上早些时候我使用的是普通的 JSF,@ManagedBean 和 @RequestScoped 运行良好。现在,当我尝试使用 spring 进行集成时,范围不起作用。

我什至尝试在 spring 配置中设置 bean 范围,但它们在 spring 上下文(单例和原型(prototype))中按预期工作,但不是 web 请求上下文。

我试图避免使用上面的 @Scope 和 @Controller 注释,希望 JSF 将管理范围,但看起来不像。

下面是我的 spring config 和 MyHelloBean 的文件片段,它可能有助于更好地沟通。
<bean id="helloBean" class="com.mkyong.common.HelloBean" init-method="init" />

<bean id="myHelloBean" class="com.mkyong.common.MyHelloBean" init-method="init" >
        <property name="helloBean" ref="helloBean"></property>
</bean>

@ManagedBean
@RequestScoped
@Scope(value="request")
@Controller
public class MyHelloBean implements Serializable {

    private static final long serialVersionUID = 1L;
    //@ManagedProperty(value = "#{helloBean}")
    private HelloBean helloBean;

见上面的 MyHelloBean 我正在使用 spring DI 来设置由 spring 设置的 helloBean。我已经注释掉了@ManagedBean,我想我可以把它留在那里,因为它会被spring以任何方式忽略,我猜JSF不会处理它,但为了安全起见,我把它注释掉了,让JSF不处理它。

为了完成我在 faces-config 中使用下面来激活 spring 使用。
<el-resolver> 
org.springframework.web.jsf.el.SpringBeanFacesELResolver 
</el-resolver> 

问候,

米腾。

最佳答案

我们的团队在集成 JSF 和 Spring bean 时遇到了类似的问题,包括它们的作用域问题。我在这里分享我们的知识。

范围

现在基本上,当您在应用程序上下文中定义时, Spring 将管理您的 bean,因此范围为 . Spring 会将 JSF 范围注释映射到他的 native 范围注释。

  • Spring 和 JSF 支持都提供范围的示例:

  • @RequestScoped 注解将映射到 @Scope("request") Spring 的注解等,以及其他支持的范围。
  • Spring 不支持 JSF 提供的作用域的示例:

  • @ViewScoped 未在 Spring 的 native 范围注释中定义,因此(不确定)它将使用 Spring 的默认范围,即单例或请求范围(不确定)。

    bean 类注入(inject)液

    在 JSF2 中,您使用 @ManagedProperty 注释进行注入(inject),而 Spring 使用 @Autowired 注释。 有什么区别和选择哪个?
  • 使用 @ManagedProperty 注入(inject) Spring bean:

  • 您希望注入(inject)的 Spring 组件必须具有一个与 jsf 注入(inject)注释的值匹配的值:@Component(value = "valueMatches") 注入(inject) @ManagedProperty(value = "valueMatches")。
  • 使用@Autowired 注入(inject) Spring bean:

  • 您希望注入(inject)的 Spring 组件必须不需要自定义值来区分,如果它是您要注入(inject)的 bean 的唯一实现:@Component 注入(inject) @Autowired。

    我们的方式

    我们使用 Spring 的注解来定义 Beans、Scopes 和 Injection。

    我们用@Scope(value = "desiredScope")、@Controller(value = "beanName") 和@Qualifier(value = "beanName") 注释标记了JSF bean。稍后可以在 faces-config.xml 中通过 @Controller 注释中定义的“beanName”值从 JSF 上下文中访问它。

    我们用 @Service 注解标记了 Spring 服务。

    我们使用 @Autowired 注解注入(inject) Spring 服务和 JSF bean。

    我们在 Web 上找到了 ViewScope 和 FlashScope 自定义实现,并将它们用于我们的 bean。因此,我们没有丢失任何 JSF2 作用域,甚至添加了新作用域。

    希望这可以帮助。

    关于spring - jsf 2.0 spring 3 范围请求不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10829032/

    相关文章:

    java - 使用 spring Application Context 时的性能问题

    jsf - 库primefaces 不包含组件步骤

    JSF 2 : Accessing managed bean's instance in the phase listener object?

    java - JPA Hibernate 在@ElementCollection 上选择不同的并进行比较

    spring - TilesConfigurer 已弃用?如何在 Spring MVC 3.1 中使用tile2.2?

    java - 理解 Spring beans 标签声明

    java - Spring AWS S3 : How to upload an image and get a URL which shows it rather than downloads it?

    jsf - f :ajax listener not called for h:selectBooleanCheckbox

    tomcat6 jsf2 安全管理器 - IllegalStateException : javax. faces.application.ApplicationFactory

    jsf-2 - 带 CDN 的 JSF 2 资源?