Текущая дата OmniFaces #{сейчас} не работает в 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 в качестве управляемого компонента. См. также Известные проблемы.   -  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, известной как issue 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;
    }
    

    И явно зарегистрируйте его как управляемый компонент в собственном /WEB-INF/faces-config.xml веб-приложения, чтобы 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