Как я могу установить собственный PropertyEditorSupport.setAsText (String) для списка выбора формы Spring? - PullRequest
4 голосов
/ 25 июня 2011

У меня есть весенняя форма.Форма содержит список выбора, связанный с типом перечисления.Я также добавил опцию «выбирать» в список выбора, который не представлен в перечислении.

Я видел некоторые темы в Интернете, где люди предлагают использовать PropertyEditor, чтобы избежать необходимости изменять перечисление и избегатьвозникло из-за ошибок преобразования между опцией «выбирать» и перечислением (пользователь может оставить опцию как выбрать - в некоторых случаях это необязательно)

Я создал PropertyEditor и пробовал его в двух сценариях.Если я попытаюсь использовать его со списком выбора (как описано ниже), форма не будет загружена, а Spring выдаст ошибки: Нет перечисления const class com.mytest.domain.Box.Choose.Если я не включаю свой пользовательский редактор, форма загружается нормально, и единственная проблема заключается в том, что при отправке формы объект ошибок будет содержать ошибки с жалобами на неудачное преобразование из Java.lang.String в BoxType.Если я переключу форму на форму: ввод вместо формы: выберите, то форма будет загружена и будет выдавать ошибки только в том случае, если я отправлю после ввода значения, которое не является одним из значений Enum.Если я введу правильное значение, я вижу, что мой BoxEditor.setAsText() не вызывается.BoxEditor.getAsText() вызывается, когда форма загружается (мозгом обезьяны является значение в поле ввода).Я в недоумении, почему вызывается метод get, а не set.Любая помощь будет принята с благодарностью.

Я определил Enum:

public enum BoxType {
    SMALL,MEDIUM,LARGE
}

И объект домена:

public class BoxRequest {
    private BoxType box;

    public BoxType getBox() {
        return box;
    }

    public void setBox(BoxType b) {
        this.box = b;
    }
}

Я создал jsp с использованием jstl иформа весны tagilb

<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ taglib uri="http://www.springframework.org/tags" prefix="s" %>
<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form" %>

<html>
<head>
<title>Box Form</title>
</head>
<body> 
<form:form id="boxrequest" method="post" modelAttribute="boxrequest">
    <form:label path="box">Choose a box size*</form:label>

       <form:input path="box"/>

        <!-- really want the form to use this once I get it working
    <form:select multiple="single" path="box">
        <form:option value="Choose"/>
        <form:options/>
    </form:select>
        -->

</form:form>
</body>
</html>

Мой PropertyEditor

public class BoxTypeEditor extends PropertyEditorSupport {

    @Override
    public void setAsText(String s) {
        System.out.println("This output is never printed :( ");
        if(StringUtils.hasText(s))
            setValue(Enum.valueOf(BoxType.class, s));
        else
            setValue(null);
    }

    @Override
    public String getAsText() {
        System.out.println("this output shows when the form loads");
        if(getValue() == null) {        
            return "monkeybrains";
        }

        BoxType b = (BoxType) getValue();
        return b.toString();
    }
}
...