我希望从我的表单中的选择框绑定到特定的枚举。
考虑这个枚举:
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;”
有没有简单的方法来执行此绑定?
由于
答案 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() );
}
...
}