JSF Converter. Метод getAsObject () получает string пустоту в параметре оцените

Я разрабатываю приложение JSF, в котором я использую контроль <p:autoComplete.../> на котором я считаю определенным converter. Далее я показываю блок упомянутого кода:

<h:outputText                               
    style="margin-left: 10px;"
    value="Operario "/>
<p:autoComplete
    size="10"
    forceSelection="true"
    style="margin-left: 10px;"
    converter="#{operarioConverter}"
    value="#{monitorizadorCentroControlador.calidadEditarControlesBean.operarioSeleccionado}"
    var="operario"
    completeMethod="#{monitorizadorCentroControlador.calidadEditarControlesBean.autocompletarOperario}"
    itemLabel="#{operario.codigo}" itemValue="#{operario}">
        <p:ajax
            event="itemSelect"
            update="operarioControlesCalidadNombre"/>
        <p:column>
            <h:outputText value="#{operario.codigo}"/>
        </p:column>
        <p:column>
            <h:outputText value="#{operario.nombre}"/>
        </p:column>
</p:autoComplete>

Осуществление converter - следующее:

@ManagedBean(name = "operarioConverter")
@SessionScoped
@FacesConverter(forClass = OperarioDTO.class)
public class OperarioConverter implements Converter, Serializable {

    @Override
    public Object getAsObject(FacesContext context, UIComponent component, String value) {
        System.out.println("OperarioConverter.getAsObject: " + value);
        long id = -1;
        try{
            id = Long.parseLong(value);
        }
        catch(Exception e){
            return null;
        }
        Transaction t = HibernateUtil.getSessionFactory().getCurrentSession().beginTransaction();
        try{
            Operario e = new OperarioServiceImpl().find(id);
            OperarioDTO operarioDTO = OperarioMapper.INSTANCE.operarioToOperarioDTO(e);
            t.commit();
            return operarioDTO;
        }
        catch(Exception e){
            t.rollback();
            e.printStackTrace();
            return null;
        }
    }

    @Override
    public String getAsString(FacesContext context, UIComponent component, Object value) {
        System.out.println("OperarioConverter.getAsString: " + value);
        if (value instanceof Operario){
            return ((OperarioDTO)value).getId().toString();
        }
        return null;
    }
}

Проблема - что, когда осуществляется призыв к методу getAsObject(...), параметр value того же самого это пустая цепь.

3
задан 11.01.2017, 15:05
0 ответов

Я рекомендую тебе не реализовывать прямые сделки в базу данных каждый раз, когда работал метод getAsObject (), так как он не является рекомендуемым согласно документации, и большинство каталогов может справляться в Bean с достижением Приложения. Ты мог бы осуществлять динамический каталог внутри объекта конвертера. Например:

public class CampoPlantillaConverter implements Converter{
List<CampoPlantilla> campos;

public CampoPlantillaConverter()
{
    super();

}

public CampoPlantillaConverter(List<CampoPlantilla> campos)
{
    this.campos = campos;

}

@Override
public Object getAsObject(FacesContext fc, UIComponent uic, String string)
{

    for (CampoPlantilla cam : this.campos)
    {
        if (("" + cam.hashCode()).equalsIgnoreCase(string))
        {
            return cam;
        }
    }

    return null;
}

@Override
public String getAsString(FacesContext fc, UIComponent uic, Object o)
{
    if (o != null)
    {
        return "" + o.hashCode();
    }

    return null;

}

public List<CampoPlantilla> getCampos()
{
    return campos;
}

public void setCampos(List<CampoPlantilla> campos)
{
    this.campos = campos;
}}    

Таким образом, ты можешь использовать конвертер как объект внутри Bean и наполнять каталог dinámicamente. Способ это осуществлять ты можешь находить здесь:

https://www.youtube.com/watch? v=Uyk0UPc8oBU

Привет.

2
ответ дан 03.12.2019, 17:45

Я не знаю, имеет ли общее он, что ты использовал аннотации @ManagedBean и @SessionScoped. Я использую общий конвертер для всех моих организаций. Я оставляю это тебе, если они хотят осуществить это в твоем проекте:

/**
 * Converter para entidades JPA. Baseia-se nas anotações @Id e @EmbeddedId para
 * identificar o atributo que representa a identidade da entidade. Capaz de
 * detectar as anotações nas classes superiores.
 *
 * @author Flávio Henrique
 * @version 1.0.3
 * @since 05/10/2010
 */
@FacesConverter("entityConverter")
public class EntityConverter implements Converter {

    @Override
    public Object getAsObject(FacesContext ctx, UIComponent component, String value) {
        if (value != null) {
            return component.getAttributes().get(value);
        }
        return null;
    }

    @Override
    public String getAsString(FacesContext ctx, UIComponent component, Object obj) {
        if (obj != null && !"".equals(obj)) {
            String id;
            try {
                id = this.getId(getClazz(ctx, component), obj);
                if (id == null) {
                    id = "";
                }
                id = id.trim();
                component.getAttributes().put(id, getClazz(ctx, component).cast(obj));
                return id;
            } catch (SecurityException | IllegalArgumentException | NoSuchFieldException | IllegalAccessException e) {
                e.printStackTrace(); // seu log aqui
            }
        }
        return null;
    }

    /**
     * Obtém, via expression language, a classe do objeto.
     *
     * @param FacesContext facesContext
     * @param UICompoment compoment
     * @return Class<?>
     */
    private Class<?> getClazz(FacesContext facesContext, UIComponent component) {
        return component.getValueExpression("value").getType(facesContext.getELContext());
    }

    /**
     * Retorna a representação em String do retorno do método anotado com @Id ou
     *
     * @param obj
     * @throws java.lang.NoSuchFieldException
     * @throws java.lang.IllegalAccessException
     * @EmbeddedId do objeto.
     * @param clazz<?> clazz
     * @return String
     */
    public String getId(Class<?> clazz, Object obj) throws SecurityException, NoSuchFieldException, IllegalArgumentException, IllegalAccessException {

        List<Class<?>> hierarquiaDeClasses = this.getHierarquiaDeClasses(clazz);

        for (Class<?> classeDaHierarquia : hierarquiaDeClasses) {
            for (Field field : classeDaHierarquia.getDeclaredFields()) {
                if ((field.getAnnotation(Id.class)) != null || field.getAnnotation(EmbeddedId.class) != null) {
                    Field privateField = classeDaHierarquia.getDeclaredField(field.getName());
                    privateField.setAccessible(true);
                    if (privateField.get(clazz.cast(obj)) != null) {
                        return (String) field.getType().cast(privateField.get(clazz.cast(obj))).toString();
                    }
                }
            }
        }
        return null;
    }

    /**
     * Retorna uma lista com a hierarquia de classes, sem considerar a classe
     * Object.class
     *
     * @param clazz
     *
     * @return List<Class<?>> clazz
     */
    public List<Class<?>> getHierarquiaDeClasses(Class<?> clazz) {

        List<Class<?>> hierarquiaDeClasses = new ArrayList<>();
        Class<?> classeNaHierarquia = clazz;
        while (classeNaHierarquia != Object.class) {
            hierarquiaDeClasses.add(classeNaHierarquia);
            classeNaHierarquia = classeNaHierarquia.getSuperclass();

        }
        return hierarquiaDeClasses;
    }
}

И ты это называешь, таким образом, в компоненте, который нуждается в этом:

converter="entityConverter"

Поскольку ты можешь видеть, он не моего авторства, а следовательно я размещаю кредиты. Этот конвертер я функционирует для всех организаций моего проекта, только в специальных случаях он мне касается использовать другой.

0
ответ дан 03.12.2019, 17:45