java - 在 Glassfish 中使用来自急切获取的 JSF 托管 bean 的 spring bean 的问题

标签 java spring jsf jakarta-ee glassfish

我正在使用 JSF 2.0 和 Spring 3.0.5 开发一个项目,该项目在 Glassfish 3.1 开源版上运行。然后我有一个用“eager”声明的 ApplicationScoped 托管 bean:

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

它有一个使用 EL 注入(inject)的托管属性:

@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 时,会抛出异常,指示未正确注入(inject)托管属性:

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 listener应该在JSF listener之前,但它没有。此外,JSF 监听器是在 JSF impl 中隐式配置的,我不知道如何更改它们的顺序。

顺便说一句,当它在 Tomcat 7 上运行时一切正常,但在 Glassfish 3.1 上它就搞砸了。也许在调用监听器的顺序上与不同的容器实现有关?

对这个问题有什么想法吗?提前致谢!

最佳答案

everything is OK when it's running on Tomcat 7, but on Glassfish 3.1 it messed up

您是否检查了项目的依赖项? afaik tomcat 7 不提供开箱即用的 jsf 2.0 支持

为了正确配置,这个 spring 论坛线程可能很有用 http://forum.springsource.org/showthread.php?86577-Spring-3-JSF-2&p=290645#post290645

关于java - 在 Glassfish 中使用来自急切获取的 JSF 托管 bean 的 spring bean 的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6369465/

相关文章:

java - OpenCV Java Harris 角点检测

java - 如何使用字符串引用类中的公共(public) int

java - 如何禁用 h :commandButton without preventing the action and actionListener from being called?

java - JSF 2、EL Expression、Weblogic 和 EJB 注入(inject)

java - 为什么 Netty 4 "proxy"示例必须将 channel "AUTO_READ"设置为 false

java - 当手动定义容器且未使用监听器注释时,如何在 spring-kafka 中暂停/恢复消费者

java - 在 Spring 4 中干燥一个通用的 RedisTemplate

spring - 将 hibernate-seach-orm 添加到 POM 后出现 AbstractMethodError

java - 使用 amqp 从队列中多路分解消息以在并行流中处理?

jsf - Websphere异常: could not find Factory: javax. faces.context.FacesContextFactory