Проблема с использованием Spring bean из управляемого JSF bean-компонента в Glassfish

Я работаю над проектом, используя JSF 2.0 и Spring 3.0.5, который работает на версии с открытым исходным кодом Glassfish 3.1. Затем у меня есть управляемый компонент ApplicationScoped, объявленный с «нетерпеливым»:

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

которые имеют управляемое свойство, введенное с помощью EL:

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

а затем настройте foo в контекстном файле Spring:

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

наконец, настройте преобразователь Spring EL в Faces-config.xml:

<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, и из трассировки стека кажется, что когда JSF начинает инициализировать компоненты JSF в com.sun.faces.config.ConfigureListener, контекст Spring еще не настроен, и поэтому возникает это исключение .

Поэтому мне интересно, есть ли что-то не так с порядком инициализации между ConfigureListener (JSF) и ContextLoaderListener (Spring), прослушиватель Spring должен предшествовать прослушивателю JSF, но этого не произошло. Кроме того, прослушиватель JSF неявно настроен в JSF, и я не знаю, как изменить их порядок.

Кстати, все в порядке, когда он работает на Tomcat 7, но на Glassfish 3.1 все испортилось. Может быть, это как-то связано с другой реализацией контейнера при вызове порядка слушателей?

Любая идея об этой проблеме? Заранее спасибо!


person julian    schedule 16.06.2011    source источник
comment
У меня тоже точно такая же проблема. Пожалуйста, опубликуйте решение, если вы его найдете.   -  person Mital Pritmani    schedule 22.03.2012


Ответы (1)


все в порядке, когда он работает на Tomcat 7, но на Glassfish 3.1 он испортился

Вы проверили зависимости вашего проекта? afaik tomcat 7 не поддерживает jsf 2.0 из коробки

для правильной настройки может быть полезна эта ветка весеннего форума http://forum.springsource.org/showthread.php?86577-Spring-3-JSF-2&p=290645#post290645

person Michael Pralow    schedule 16.06.2011
comment
спасибо, Майкл, да, у меня есть зависимость JSF как Mojarra 2.0.4 явно для Tomcat 7, в то время как в Glassfish это будет проигнорировано, поскольку в Glassfish встроена реализация JSF как Mojarra 2.1.0. Для конфигурации Spring я не обнаружил никаких проблем, а также проект смог хорошо работать в Tomcat 7, если что-то пойдет не так с конфигурацией, я думаю, этого не должно быть. - person julian; 17.06.2011