我正在使用JSF 2.0和Spring 3.0.5的項目,該項目運行在Glassfish 3.1開源版本上。然後,我有一個ApplicationScoped管理的聲明與 '渴望' 豆:Glassfish中使用JSF託管bean的spring bean的問題
@ManagedProperty(#{foo})
private Foo foo;
,然後在Spring上下文文件中配置FOO:
<bean id="foo" class="Foo" />
@ManagedBean(eager = true)
@ApplicationScoped
public class CommonMB
其中有一個託管屬性使用EL注入最後在faces-config.xml中配置Spring EL resolver:
畢竟,當我開始了Glassfish的,引發異常指示管理propertiy沒有被正確注射:
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 impl中的,我不知道如何更改它們的順序。
順便說一句,當它在Tomcat 7上運行時,一切正常,但在Glassfish 3.1上卻搞砸了。也許在調用監聽器的順序時有不同的容器實現方式?
有關這個問題的任何想法?提前致謝!
我也正好具有同樣的問題。如果您發現任何問題,請發佈解決方案。 – 2012-03-22 12:58:07