Glassfish中使用JSF托管bean的spring bean的问题

问题描述:

我正在使用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上却搞砸了。也许在调用监听器的顺序时有不同的容器实现方式?

有关这个问题的任何想法?提前致谢!

+0

我也正好具有同样的问题。如果您发现任何问题,请发布解决方案。 – 2012-03-22 12:58:07

一切正常时,它在Tomcat 7上运行,但在Glassfish 3.1它你检查项目的依赖关系搞砸

?据我所知的Tomcat 7不提供JSF 2.0支持开箱

为正确配置的今年春季论坛的帖子可能是有用的http://forum.springsource.org/showthread.php?86577-Spring-3-JSF-2&p=290645#post290645

+0

感谢迈克尔,是的,我有JSF依赖作为Mojarra 2.0.4明确地为Tomcat 7,而在glassfish这将被忽略,因为glassfish已经在JSF实现中构建为Mojarra 2.1.0。对于Spring配置,我没有发现任何问题,并且该项目能够在Tomcat 7中正常工作,如果配置出现问题,则不应该出现这种情况。 – julian 2011-06-17 01:50:29