Первоначально выбранные элементы в p: selectCheckboxMenu, показывающие ссылку на объект вместо значения - PullRequest
0 голосов
/ 30 апреля 2018

Добрый день. В моем проекте у меня есть список пользовательских объектов, которые я использую в своем PrimeFaces p:selectCheckboxMenu. Я использую конвертер для этого класса. Раскрывающийся список выглядит великолепно, и если я выбираю элемент из списка, «фишки» отображаются правильно. Однако, если я загружаю выбранный список при инициализации, выбранный «чип» показывает ссылку на класс (com.test.Characteristic@56e76bff) вместо значения объекта. Я ожидаю, что он покажет возвращаемое значение getAsString из конвертера. Что я делаю неправильно?

Example of what I am seeing

к коду для этого: Пользовательский объект

    public class Characteristic {
    public Characteristic() {
        super();
    }
    private String key;
    private String value;
    private String type;

    public Characteristic(String key, String value, String type) {
        this.key = key;
        this.value = value;
        this.type = type;
    }

    public void setKey(String key) {
        this.key = key;
    }

    public String getKey() {
        return key;
    }

    public void setValue(String value) {
        this.value = value;
    }

    public String getValue() {
        return value;
    }

    public void setType(String type) {
        this.type = type;
    }

    public String getType() {
        return type;
    }
}

Конвертер:

    @FacesConverter(value = "characteristicConverter")
    public class CharacteristicConverter implements Converter {
        public Object getAsObject(FacesContext fc, UIComponent uic, String value) {
            return new Characteristic("testKey", value, "testType");
        }

        public String getAsString(FacesContext fc, UIComponent uic, Object object) {
            if (object == null) {
                return "";
            }
            if (object instanceof Characteristic) {
                Characteristic cha = (Characteristic) object;
                String name = cha.getValue();
                System.out.println("In the converter. Returning " + name);                
                return name;
            } else {
                throw new ConverterException(new FacesMessage(object + " is not a Characteristic"));
            }
        }
    }

System.out.prinln в конвертере отображает это при запуске:

В преобразователе. Возвращает char1value

В преобразователе. Возвращает char2value

В преобразователе. Возвращает char3value

В преобразователе. Возвращает char1value

Боб:

@ManagedBean(name = "checkboxView")
public class CheckboxView {

    private List<Characteristic> allChars;
    private List<Characteristic> selectedChars;

    @PostConstruct
    public void init() {

        allChars = new ArrayList<Characteristic>();
        allChars.add(new Characteristic("char1key","char1value","test"));
        allChars.add(new Characteristic("char2key","char2value","test"));
        allChars.add(new Characteristic("char3key","char3value","test"));
        selectedChars = new ArrayList<Characteristic>();
        selectedChars.add(new Characteristic("char1key","char1value","test"));
    }

    public void setAllChars(List<Characteristic> allChars) {
        this.allChars = allChars;
    }

    public List<Characteristic> getAllChars() {
        return allChars;
    }

    public void setSelectedChars(List<Characteristic> selectedChars) {
        this.selectedChars = selectedChars;
    }

    public List<Characteristic> getSelectedChars() {
        return selectedChars;
    }
}

Страница:

<html xmlns="http://www.w3.org/1999/xhtml" xmlns:h="http://java.sun.com/jsf/html" xmlns:f="http://java.sun.com/jsf/core"
      xmlns:p="http://primefaces.org/ui">
    <h:head></h:head>
    <h:body>
        <h:form>
            <p:selectCheckboxMenu id="multiple" value="#{checkboxView.selectedChars}" label="Characteristics"
                                  multiple="true" filter="true" filterMatchMode="startsWith"
                                  converter="characteristicConverter">
                <f:selectItems value="#{checkboxView.allChars}" var="cha" itemLabel="#{cha.value}" itemValue="#{cha}"/>
            </p:selectCheckboxMenu>
        </h:form>
    </h:body>
</html>      

1 Ответ

0 голосов
/ 01 мая 2018

Я подозреваю, что это связано со сравнением характеристик в списке с предварительно выбранными (поскольку в визуальном списке он также не выбран, и он, скорее всего, также потерпит неудачу с h:selectManyCheckbox). Вы можете попробовать изменить

@PostConstruct
public void init() {

    allChars = new ArrayList<Characteristic>();
    allChars.add(new Characteristic("char1key","char1value","test"));
    allChars.add(new Characteristic("char2key","char2value","test"));
    allChars.add(new Characteristic("char3key","char3value","test"));
    selectedChars = new ArrayList<Characteristic>();
    selectedChars.add(new Characteristic("char1key","char1value","test"));
}

до

@PostConstruct
public void init() {

    allChars = new ArrayList<Characteristic>();
    Characteristic char1 = new Characteristic("char1key","char1value","test");
    Characteristic char2 = new Characteristic("char2key","char2value","test");
    Characteristic char3 = new Characteristic("char3key","char3value","test");
    allChars.add(char1);
    allChars.add(char2);
    allChars.add(char3);


    selectedChars = new ArrayList<Characteristic>();
    selectedChars.add(char1);
}

Таким образом, выбранный символ «char1» идентичен объекту в списке. Но еще лучше было бы попытаться реализовать равенство и хэш характеристики явно.

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