我有一个弹簧形式。该表单包含一个绑定到枚举类型的选择列表。我还在枚举中未表示的选择列表中添加了一个“选择”选项。
我在网上看到了一些线程,人们建议使用 PropertyEditor 来避免修改枚举并避免 spring 在“选择”选项和枚举之间引发转换错误(用户可以将选项保留为选择 - 在某些情况下是可选的案例)
我创建了一个 PropertyEditor 并在两种情况下进行了尝试。如果我尝试将它与选择列表一起使用(如下所述),表单将不会加载,并且 spring 会抛出错误:No enum const class com.mytest.domain.Box.Choose。如果我不包含我的自定义编辑器,表单加载正常,唯一的问题是提交表单时,错误对象将包含抱怨从 Java.lang.String 到 BoxType 的转换失败的错误。如果我将表单切换到表单:输入而不是表单:选择,那么表单将加载,并且只有在输入不是枚举值之一的值后提交时才会抛出错误。如果我输入一个有效值,我可以看到 myBoxEditor.setAsText()
没有被调用。 BoxEditor.getAsText()
表单加载时被调用(猴脑是输入字段中的值)。我不知道为什么调用 get 方法,而不是 set。任何帮助将不胜感激。
我定义了一个枚举:
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;
}
}
我使用 jstl 和 spring 的 form tagilb 创建了一个 jsp
<%@ 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>
我的属性编辑器
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();
}
}