2012-01-11 26 views
1

我期待從我的表單中的選擇框綁定到特定的枚舉。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> 

頁面呈現的罰款,並在下拉列表顯示各種不同的「>」,「<」符號框

但是,當我提交我的表單時,我會收到錯誤,當它試圖將值綁定回枚舉 例如「沒有枚舉const類com.fmrco.insight.adminconsole.dto.enums.OperatorDTO。<」

有沒有簡單的方法來執行此綁定?

感謝

回答

6

儘量省略itemValue="operator"

項目值應該是枚舉常量的名稱,並且據我所知它是一個默認行爲。

1

表單標籤代碼段是正確的,並且枚舉也是正確的。這裏缺少的是轉換器,Spring將使用該轉換器將字符串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()); 
    } 

    ... 
}