Spring MVC:从form:bind到enum绑定

时间:2012-01-11 16:06:38

标签: spring-mvc

我希望从我的表单中的选择框绑定到特定的枚举。

考虑这个枚举:

public enum OperatorDTO {
LESS_THAN ("<"),
GREATER_THAN (">"),
EQUALS ("="),
NOT_EQUALS("!=");

private String operator;

public String getOperator() {
    return operator;
}

private OperatorDTO(String operator)
{
    this.operator = operator;
}

和我的表格中的这个片段:

<form:select path="rules[${counter.index}].operator">
    <form:options itemLabel="operator" itemValue="operator" />
</form:select>

页面渲染正常并显示各种“&gt;”,“&lt;”下拉框中的符号

但是,当我提交表单时,我尝试将值绑定回枚举时会出错 例如“没有enum const class com.fmrco.insight.adminconsole.dto.enums.OperatorDTO。&lt;”

有没有简单的方法来执行此绑定?

由于

2 个答案:

答案 0 :(得分:6)

尝试省略itemValue="operator"

项目值应该是枚举常量的名称,据我记得它是默认行为。

答案 1 :(得分:1)

表单标记代码段是正确的,枚举也是正确的。这里缺少的是Spring将用于将String从form:options元素转换为OperatorDTO enum的转换器。

1)向OperatorDTO枚举

再添加两个方法
    // Enum level method to get enum instance by operator field.
    public static OperatorDTO getByOperator( final String p_operator ) {
        for ( OperatorDTO operatorDTO : OperatorDTO.values() ) {
            if ( operatorDTO.isOperatorEqual( p_operator ) ) {
                return operatorDTO;
            }
        }
        return null;
    }
    // Instance level method to compare operator field.
    public boolean isOperatorEqual( final String p_operator ) {
        return getOperator().equals( p_operator ) ? true : false;
    }

2)创建自定义转换器,例如

import org.springframework.core.convert.converter.Converter;

public class OperatorDTOConverter implements Converter<String, OperatorDTO> {
    public OperatorDTO convert( String source ) {
        return OperatorDTO.getByOperator( source.trim() );
    }
}

3)应用配置中的Registeg转换器(在这种情况下为 java config

@Configuration
@EnableWebMvc
@ComponentScan( basePackages = { "your.base.package"} )
public class AppWebConfig extends WebMvcConfigurerAdapter {
@Override
    public void addFormatters( FormatterRegistry registry ) {
        registry.addConverter( String.class, OperatorDTO.class, new OperatorDTOConverter() );
    }

    ...
}