Управление bean-компонентами в JSF 2.2 в WebSphere 9 - PullRequest
0 голосов
/ 03 июля 2018

Публикация этой проблемы / ответа, так как я не нашел ни одного другого вопроса, который был бы очень похож. Много связанных, но не тот же сценарий.

Обновлялось приложение JSF 2.1 до JSF 2.2 (Mojarra) для поддержки h: fileUpload. Приложение работает в WebSphere 9, и после обновления возникли проблемы с внедрением зависимостей с использованием JSF Beans.

Читая далее, я понимаю, что JSF @ManagedBean следует считать устаревшим и его следует перенести на CDI @Named, но наше приложение имеет 627 ссылок на FacesContext, а миграция на bean-компонент CDI будет означать обновление всех этих мест для создания либо FacesContext, когда необходимо, или обновите JSF до 2.3 и введите FacesContext, где это необходимо. Это значит оставаться на JSF 2.2 на данный момент.

Вот боб:

package com.company.customersearch;

import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ManagedProperty;
import javax.faces.bean.ViewScoped;
import javax.faces.context.FacesContext;
import javax.servlet.http.HttpSession;

@ManagedBean(name = "customerSearchManager")
@ViewScoped
public class customerSearchManager extends PortletManager{

    private static final long serialVersionUID = -9050481751306478727L;
    private Long customerId;
    private SessionData sessionData;

    @ManagedProperty(value = "#{customerSearchService}")
    private CustomerSearchService service;

    public CustomerSearchManager(){
        this.sessionData = new SessionData((HttpSession) FacesContext.getCurrentInstance().getExternalContext().getSession(false));
        if (sessionData.hasSelectedCustomer())
            this.customerId = sessionData.getData().getCustomerId();
    }   

...
}

Работа в WebSphere 9 производила NullPointerException

Error Rendering View[/pages/customer-search.xhtml]
                                 java.lang.NullPointerException
    at com.sun.faces.application.view.ViewScopedCDIEventFireHelperImpl.fireInitializedEvent(ViewScopedCDIEventFireHelperImpl.java:60)
    at com.sun.faces.application.view.ViewScopeContextManager.fireInitializedEvent(ViewScopeContextManager.java:394)
    at com.sun.faces.application.view.ViewScopeManager.processPostConstructViewMap(ViewScopeManager.java:312)
    at com.sun.faces.application.view.ViewScopeManager.processEvent(ViewScopeManager.java:244)
    at com.sun.faces.application.view.ViewScopeEventListener.processEvent(ViewScopeEventListener.java:68)

NPE выходит из класса, связанного с CDI! Зачем нам получать NPE внутри ViewScopedCDIEventFireHelperImpl.java, когда намеренно не используется CDI ??

1 Ответ

0 голосов
/ 03 июля 2018

Я не знаю, работают ли другие корпоративные контейнеры таким образом, но для WebSphere CDI включен по умолчанию и явно переопределяет или пытается заменить компоненты JSF во время выполнения (??). Хотелось бы, чтобы я немного больше понял, что происходит в контейнере в этом сценарии.

На сайте IBM найдено следующее относительно настроек CDI:

http://www -01.ibm.com / поддержка / docview.wss? UID = swg21983564

Там вы можете видеть, что для вашей виртуальной машины Java есть 2 свойства, которые вы действительно хотите использовать JSF @ManagedBean s и избегать конфликтов с CDI вместе. Работал на меня.

Набор:

com.ibm.ws.cdi.enableCDI = false
com.ibm.ws.cdi.enableImplicitBeanArchives  = false

Надеюсь, это кому-нибудь поможет.

...