Почему JSF в GlassFish 5.1.0 устанавливает для свойства ID моего bean-компонента @ViewScoped значение NULL? - PullRequest
0 голосов
/ 23 апреля 2019

Я нахожусь в процессе обновления с GlassFish 4.1.2 до GlassFish 5.1.0 и столкнулся с проблемой, когда фаза Обновления модели жизненного цикла JSF устанавливает значение свойства ID моих компонентов поддержки @ViewScoped CDI равным нулю , Вот мое упрощенное представление.

<ui:composition xmlns="http://www.w3.org/1999/xhtml"
xmlns:ui="http://xmlns.jcp.org/jsf/facelets"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:h="http://xmlns.jcp.org/jsf/html"
xmlns:p="http://primefaces.org/ui"
template="/WEB-INF/templates/modena.xhtml">
<ui:define name="title">Location Editor2</ui:define>
<ui:define name="content">
    <f:metadata>
        <f:viewParam name="id" value="#{locationEditor2.location.id}" />
        <f:viewAction action="#{locationEditor2.setLocationById}" />
    </f:metadata>
    <h:form id="location-editor-form">
        <p:commandButton value="Update" styleClass="RaisedButton"
            action="#{locationEditor2.updateLocation}" update="@form" />
    </h:form>
</ui:define>
</ui:composition>

Ниже приведен мой упрощенный компонент поддержки CDI.

import java.io.Serializable;

import javax.ejb.EJB;
import javax.ejb.EJBException;
import javax.faces.application.FacesMessage;
import javax.faces.context.FacesContext;
import javax.faces.view.ViewScoped;
import javax.inject.Named;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.elliottlogic.elis.ejb.location.Location;
import com.elliottlogic.elis.ejb.location.LocationManager;
import com.elliottlogic.elis.ejb.security.AuthorizationException;
import com.elliottlogic.elis.wa.core.ExceptionTools;

/**
 * The <code>LocationEditor2</code> class TODO Complete Type Description
 *
 * @author jre
 * @version $Id: $
 *
 */
@Named
@ViewScoped
public class LocationEditor2 implements Serializable {

final static Logger logger = LoggerFactory.getLogger(LocationEditor2.class.getName());

static final long serialVersionUID = 1L;

private Location location = new Location();

@EJB
private LocationManager locationManager;

/**
 * Configures model using persisted values.
 * 
 * @throws AuthorizationException
 */
public void setLocationById() throws AuthorizationException {

    try {

        location = locationManager.readLocationByID(location.getId());

    } catch (EJBException e) {

        FacesContext.getCurrentInstance().addMessage(null,
                new FacesMessage(FacesMessage.SEVERITY_ERROR, "Location not found.", "Location not found."));

        ExceptionTools.unwrapEJBException(FacesContext.getCurrentInstance(), e);

    }

}

/**
 * Saves the changes to the location.
 * 
 * @return
 */
public String updateLocation() {

    logger.debug("Location ID: {}", location.getId());

    return null;

}

/**
 * @return the location
 */
public Location getLocation() {
    return location;
}

/**
 * @param location
 *            the location to set
 */
public void setLocation(Location location) {
    this.location = location;
}

}

Следующая проблема демонстрирует:

  1. Укажите браузер на LocationEditor2.xhtml? Id = 1
  2. Выберите кнопку [Обновить].
  3. Метод updateLocation регистрирует «Идентификатор местоположения: 1»
  4. Выберите кнопку [Обновить]
  5. Метод updateLocation регистрирует «Идентификатор местоположения: ноль»

Я убедился, что представление не воссоздается и что-то вызывает метод setId (Long id) со значением null во время фазы обновления JSF-модели.

Почему в фазе модели обновления JSF идентификатор моей сущности устанавливается равным нулю во время второй и дополнительной обратной передачи?

1 Ответ

0 голосов
/ 25 апреля 2019

Основная причина проблемы заключается в том, что что-то вызывает метод setId (null) для моей сущности на этапе обновления модели жизненного цикла JSF. Я использовал массив StackTraceElement [] в моем методе setId () для проверки вызывающих методов и определил, что виноват метод updateModel класса UIViewParameter.

После небольшого поиска я обнаружил OmniFaces viewParam Showcase , который обеспечивает «Режим без сохранения состояния, чтобы избежать ненужного преобразования, проверки и обновления модели при обратных передачах». После изменения моего кода для использования компонента viewParam OmniFaces инфраструктура модели обновления JSF перестала вызывать метод setId () для моей сущности во время обратной передачи, и все работало так же, как в GlassFish 4.1.2.

Решением является переход от стандартного f: viewParam к OmniFaces o: viewParam.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...