JSF2.0 Spring3作用域请求不起作用
我试图使用spring向jsf提供托管bean。我假设@ManagedBean将被JSF容器拾取,以将JSF中的EL链接到托管bean,即使我通过在faces-config.xml中配置spring用法来使用spring也是如此 Spring将提供bean,但现在谁管理bean的范围? 我曾尝试在bean上进行如下注释,以使其成为请求范围,但它们不起作用JSF2.0 Spring3作用域请求不起作用,spring,jsf-2,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 f
@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上下文(单例和原型)中的工作与预期的一样,而不是web请求上下文
我试图避免使用上面的@Scope和@Controller注释,希望JSF能够管理作用域,但看起来不像
下面是我的spring配置和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;
@ManagedBean
@请求范围
@范围(value=“请求”)
@控制器
公共类MyHelloBean实现了可序列化{
私有静态最终长serialVersionUID=1L;
//@ManagedProperty(value=“#{helloBean}”)
私人Helloben Helloben;
在上面的MyHelloBean中,我使用spring DI设置helloBean,它由spring fine设置。我已经注释掉了@ManagedBean,我想我可以将它保留在那里,因为spring会以任何方式忽略它,JSF不会处理它,我想,但为了安全起见,我注释掉了它,让JSF不处理它
为了完成,我在faces配置中使用下面的命令来激活spring的使用
<el-resolver>
org.springframework.web.jsf.el.SpringBeanFacesELResolver
</el-resolver>
org.springframework.web.jsf.el.SpringBeanFacesELResolver
问候,
Miten.您的方法有点混乱,因为您似乎混合了Spring XML配置和Spring配置。如示例所述,如果您使用的是带注释的配置,那么您应该:
<context:component-scan base-package="com.yourcom.package" />
<bean id="helloBean" class="com.mkyong.common.HelloBean" init-method="init" scope="request" />
为注释订购Spring扫描。否则,如果使用XML配置,则应具有:
<context:component-scan base-package="com.yourcom.package" />
<bean id="helloBean" class="com.mkyong.common.HelloBean" init-method="init" scope="request" />
默认情况下,Springbean的
作用域是单例
我们的团队在集成JSF和Springbean时遇到了类似的问题,包括它们的作用域的问题。我在这里分享我们的知识
范围
基本上现在,当您在应用程序上下文中定义时,Spring将管理您的bean,因此作用域
- Spring和JSF支持都提供作用域时的示例:
@RequestScope注释将映射到@Scope(“request”)Spring的注释,以及其他受支持的范围
- Spring不支持JSF提供的作用域时的示例:
@ViewScope未在Spring的本机作用域注释中定义,因此(不确定)它将使用Spring的默认作用域,即singleton或请求作用域(不确定)
豆制品
在JSF2中,您使用@ManagedProperty注释进行注入,而Spring使用@Autowired注释。有什么区别,可以选择哪个?
- 使用@ManagedProperty注入Spring bean:
您希望注入的Spring组件必须有一个与jsf注入注释的值相匹配的值:@component(value=“valueMatches”)注入@ManagedProperty(value=“valueMatches”)
- 使用@Autowired注入Spring bean:
如果您希望注入的Spring组件是您注入的bean的唯一实现,则它不需要自定义值来区分:@component inspected with@Autowired
我们的路
我们使用Spring的注释来定义bean、作用域和注入
我们用@Scope(value=“desiredScope”)、@Controller(value=“beanName”)和@Qualifier(value=“beanName”)注释标记JSF bean。稍后,可以通过@Controller注释中定义的“beanName”值在faces-config.xml的帮助下从JSF上下文访问这些注释
我们用@Service注释标记了Spring服务
我们使用@Autowired注释注入了Spring服务和JSF bean
我们在web上找到了ViewScope和FlashScope自定义实现,并将它们用于我们的bean。因此,我们没有丢失任何JSF2作用域,甚至添加了新的作用域
希望这能有所帮助。你完全正确。我能够将scope=request添加到spring配置中,并将我的简单的旧jsf bean与它们的注释一起保留,它可以按预期工作。我对spring端的注释和作用域感到困惑。其他回复分享了一些关于作用域和注入的更多想法,但我觉得这一个更简单、更容易我只知道spring bean的两个作用域。这些其他作用域列在哪里?spring web(上下文加载器)理解这些新的作用域,因此它们在spring web上下文中是有意义的?或者它们对核心spring也有效?我怀疑?谢谢你的回复。我想我需要阅读一些spring web(spring mvc?)了解这些新注释、注入、服务、组件和限定符的相关说明。我更喜欢不使用它们而直接使用scope=“request”在bean配置中,正如其他回复所指出的。是的,这很好。在我们的例子中,我们只是需要JSF的ViewScope,但我们的应用程序是基于Spring beans的,所以这对我们来说更好。请注意这里提到的Spring和JSF2可能存在的问题,特别是如果您要注入Spring组件并使用状态来支持JSF支持,但Spring不支持。@JMelnik您能分享您的FlashScope代码吗?我很难找到它online@Andre抱歉,找不到。请尝试搜索类似“spring flash scope”的内容。@JMelnik我已经做了一段时间了,但运气不好。显然是spring