У меня есть весенняя форма.Форма содержит список выбора, связанный с типом перечисления.Я также добавил опцию «выбирать» в список выбора, который не представлен в перечислении.
Я видел некоторые темы в Интернете, где люди предлагают использовать 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();
}
}