簡體   English   中英

在Glassfish中使用從預先獲取的JSF管理的bean中使用spring bean的問題

[英]Problem with using spring bean from eagerly-fetched JSF managed bean in Glassfish

我正在使用JSF 2.0和Spring 3.0.5進行項目,該項目在Glassfish 3.1開源版本上運行。 然后我有一個用'eager'聲明的ApplicationScoped托管bean:

@ManagedBean(eager = true)
@ApplicationScoped
public class CommonMB

具有使用EL注入的托管屬性:

@ManagedProperty(#{foo})
private Foo foo;

然后在Spring上下文文件中配置foo:

<bean id="foo" class="Foo" />

最后在faces-config.xml中配置Spring EL解析器:

<el-resolver>org.springframework.web.jsf.el.SpringBeanFacesELResolver</el-resolver>

畢竟,當我啟動Glassfish時,會引發異常,表明托管屬性未正確注入:

Caused by: com.sun.faces.mgbean.ManagedBeanCreationException: unable to set property 'foo' on managed bean 'commonMB'
at com.sun.faces.mgbean.ManagedBeanBuilder$BakedBeanProperty.set(ManagedBeanBuilder.java:615)
at com.sun.faces.mgbean.ManagedBeanBuilder.buildBean(ManagedBeanBuilder.java:133)
at com.sun.faces.mgbean.BeanBuilder.build(BeanBuilder.java:104)
at com.sun.faces.mgbean.BeanManager.createAndPush(BeanManager.java:409)
at com.sun.faces.mgbean.BeanManager.create(BeanManager.java:269)
at com.sun.faces.mgbean.BeanManager.create(BeanManager.java:256)
at com.sun.faces.config.ConfigureListener.contextInitialized(ConfigureListener.java:255)
... 76 more
Caused by: java.lang.IllegalStateException: No WebApplicationContext found: no ContextLoaderListener registered?
at org.springframework.web.jsf.FacesContextUtils.getRequiredWebApplicationContext(FacesContextUtils.java:83)
at org.springframework.web.jsf.DelegatingVariableResolver.getWebApplicationContext(DelegatingVariableResolver.java:167)
at org.springframework.web.jsf.DelegatingVariableResolver.getBeanFactory(DelegatingVariableResolver.java:156)
at org.springframework.web.jsf.DelegatingVariableResolver.resolveSpringBean(DelegatingVariableResolver.java:134)
at org.springframework.web.jsf.DelegatingVariableResolver.resolveVariable(DelegatingVariableResolver.java:112)
at com.sun.faces.el.VariableResolverChainWrapper.getValue(VariableResolverChainWrapper.java:115)
at com.sun.faces.el.DemuxCompositeELResolver._getValue(DemuxCompositeELResolver.java:176)
at com.sun.faces.el.DemuxCompositeELResolver.getValue(DemuxCompositeELResolver.java:203)
at de.odysseus.el.tree.impl.ast.AstIdentifier.eval(AstIdentifier.java:84)
at de.odysseus.el.tree.impl.ast.AstEval.eval(AstEval.java:51)
at de.odysseus.el.tree.impl.ast.AstNode.getValue(AstNode.java:30)
at de.odysseus.el.TreeValueExpression.getValue(TreeValueExpression.java:122)
at org.jboss.weld.el.WeldValueExpression.getValue(WeldValueExpression.java:55)
at com.sun.faces.mgbean.BeanBuilder$Expression.evaluate(BeanBuilder.java:591)
at com.sun.faces.mgbean.ManagedBeanBuilder$BakedBeanProperty.set(ManagedBeanBuilder.java:606)
... 82 more

由於我使用ContextLoaderListener初始化Spring Bean,並且從堆棧跟蹤中可以看出,當JSF開始在com.sun.faces.config.ConfigureListener中初始化JSF Bean時,尚未設置Spring上下文,這就是為什么發生此異常的原因。

因此,我想知道ConfigureListener(JSF)和ContextLoaderListener(Spring)之間的初始化順序是否有問題,Spring偵聽器應該位於JSF偵聽器之前,但事實並非如此。 此外,JSF偵聽器是隱式配置在JSF中的,我不知道如何更改其順序。

順便說一句,當它在Tomcat 7上運行時,一切正常,但是在Glassfish 3.1上,它搞砸了。 也許在調用偵聽器順序上與不同的容器實現有關?

關於這個問題有什么想法嗎? 提前致謝!

在Tomcat 7上運行時,一切正常,但在Glassfish 3.1上,一切混亂

您是否檢查了項目的依賴關系? afaik tomcat 7不提供jsf 2.0支持

對於正確的配置,這個spring論壇線程可能有用http://forum.springsource.org/showthread.php?86577-Spring-3-JSF-2&p=290645#post290645

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM