4

我有一个弹簧形式。该表单包含一个绑定到枚举类型的选择列表。我还在枚举中未表示的选择列表中添加了一个“选择”选项。

我在网上看到了一些线程,人们建议使用 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();
    }
}
4

0 回答 0