Текущата дата на OmniFaces #{now} не работи в GlassFish 4.0

Използвах OmniFaces #{now} с PrimeFaces 3.5 и JSF 2.1, за да получа текуща дата в EL. Винаги е работил добре, но след скорошна миграция към PrimeFaces 4.0 и JSF 2.2, използването на #{now} хвърля NullPointerException.

Caused by: java.lang.NullPointerException
    at org.glassfish.weld.DeploymentImpl.findRootBda(DeploymentImpl.java:700)
    at org.glassfish.weld.DeploymentImpl.getBeanDeploymentArchive(DeploymentImpl.java:682)
    at org.jboss.weld.manager.BeanManagerLookupService.lookupBeanManager(BeanManagerLookupService.java:48)
    at org.jboss.weld.manager.BeanManagerLookupService.lookupBeanManager(BeanManagerLookupService.java:60)
    at org.jboss.weld.manager.BeanManagerImpl.getInjectionTargetFactory(BeanManagerImpl.java:1381)
    at org.jboss.weld.manager.BeanManagerImpl.createInjectionTarget(BeanManagerImpl.java:1039)
    at org.glassfish.weld.services.JCDIServiceImpl.injectManagedObject(JCDIServiceImpl.java:283)
    at org.glassfish.faces.integration.GlassFishInjectionProvider.inject(GlassFishInjectionProvider.java:189)
    at com.sun.faces.mgbean.BeanBuilder.injectResources(BeanBuilder.java:203)
    at com.sun.faces.mgbean.BeanBuilder.build(BeanBuilder.java:101)
    at com.sun.faces.mgbean.BeanManager.createAndPush(BeanManager.java:409)
    at com.sun.faces.mgbean.BeanManager.create(BeanManager.java:269)
    at com.sun.faces.el.ManagedBeanELResolver.resolveBean(ManagedBeanELResolver.java:244)
    at com.sun.faces.el.ManagedBeanELResolver.getValue(ManagedBeanELResolver.java:116)
    at com.sun.faces.el.DemuxCompositeELResolver._getValue(DemuxCompositeELResolver.java:176)
    at com.sun.faces.el.DemuxCompositeELResolver.getValue(DemuxCompositeELResolver.java:203)
    at com.sun.el.parser.AstIdentifier.getValue(AstIdentifier.java:116)
    at com.sun.el.ValueExpressionImpl.getValue(ValueExpressionImpl.java:226)
    at org.jboss.weld.el.WeldValueExpression.getValue(WeldValueExpression.java:50)
    at com.sun.faces.facelets.el.ELText$ELTextVariable.writeText(ELText.java:227)
    at com.sun.faces.facelets.el.ELText$ELTextComposite.writeText(ELText.java:150)
    at com.sun.faces.facelets.compiler.TextInstruction.write(TextInstruction.java:85)
    ... 39 more

Как се причинява това и как мога да го разреша?


person Bikram    schedule 05.04.2014    source източник
comment
Кой сървър използвате? Има известна грешка в GlassFish 4, свързана с използването на java.util.Date като управляван bean. Вижте също Известни проблеми.   -  person BalusC    schedule 05.04.2014
comment
Благодаря, че ми съобщихте. Използвам GF4. Бях гласувал за този бъг. Има ли някакво решение на този проблем.   -  person Bikram    schedule 07.04.2014
comment
В GF 4.1 отново работи.   -  person djmj    schedule 10.10.2014
comment
Страхотен. Благодаря за новините.   -  person Bikram    schedule 11.10.2014


Отговори (1)


Това е причинено от грешка в GlassFish 4.0, известна като проблем 20775.

Имате основно 3 възможности:

  1. Използвайте друг сървър. След GlassFish 4.0 официално е обявено, че версията с отворен код не се препоръчва за производство. Oracle спря търговската поддръжка върху него. Към момента той все още е абсолютно същият като първото издание от юли 2013 г., пълен с различни детски грешки. В момента единствената ви алтернатива с отворен код е JBoss WildFly. Други доставчици все още нямат готов сървър за приложения Java EE 7.


  2. Създайте клас, който разширява java.util.Date:

    public class Now extends Date {
        private static final long serialVersionUID = 1L;
    }
    

    И изрично го регистрирайте като управляван bean в собствения /WEB-INF/faces-config.xml на webapp, така че OmniFaces да бъде заменен:

    <managed-bean>
        <managed-bean-name>now</managed-bean-name>
        <managed-bean-class>com.example.Now</managed-bean-class>
        <managed-bean-scope>request</managed-bean-scope>
    </managed-bean>
    

  3. Ръчно задайте #{now} с помощта на сервлет филтър. Най-просто може да изглежда така в своята цялост (вносът е пропуснат за краткост):

    @WebFilter("/*")
    public class ApplicationFilter extends HttpFilter {
    
        @Override
        public void doFilter(HttpServletRequest request, HttpServletResponse response, HttpSession session, FilterChain chain) throws ServletException, IOException {
            request.setAttribute("now", new Date());
            chain.doFilter(request, response);
        }
    
    }
    

Актуализация: този неудобен бъг е коригиран в GlassFish 4.1, очевидно като следствие от друга корекция на бъг. Така че, ако все още искате да се придържате към GlassFish (въпреки че не се препоръчва за производство) и ако можете да надстроите, надстройте старата риба възможно най-скоро. Той има много, много, повече корекции на грешки поне в JSF и CDI областите, така че определено си заслужава усилието.

person BalusC    schedule 09.04.2014
comment
Решение 2 не работи за мен. Изключението вече е възникнало преди извикването на метода doFilter. - person djmj; 23.04.2014
comment
@djmj: работи за мен при настройка по подразбиране/немодифицирана GF4. - person BalusC; 23.04.2014
comment
Хм за мен не. Исках да мигрирам към jsf 2.2 на GF4. Може би някои други филтри или конфигурации създават проблеми. В момента просто използвам bean с обхват на заявка с нов екземпляр на дата като заобиколно решение. - person djmj; 24.04.2014