Help primeface selectonelistbox

0

Foreros greetings The value returned by a oneSelectListBox in the event change value using xvalor = listBox1.getSubmittedValue() returns me one:

  

object = {id = 10, code = 25, description = Cheese Company}.

I need to cast or convert that object into a class with the same structure or extract the key = value pairs, in Hashmap or in map or in list .

Please any help or solution would be highly appreciated.

    
asked by ramon 12.05.2017 в 14:55
source

1 answer

0

You have used the attribute converter of oneSelectListBox and put this: converter="entityConverter" .

The code of the converter is as follows:

import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.List;

import javax.faces.component.UIComponent;
import javax.faces.context.FacesContext;
import javax.faces.convert.Converter;
import javax.faces.convert.FacesConverter;
import javax.persistence.EmbeddedId;
import javax.persistence.Id;

/**
 * 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;
    }
}
    
answered by 12.05.2017 в 19:07