枚举类型可以增强代码的可读性和健壮性,在项目中有广泛的使用,比如,我们有一个代码数据库类型的枚举: public enum DatabaseType{ oracle, mysql, sqlServer } 在另一个数据源对象中,引用了这个枚举类型,如: public class DataSource { private DatabaseType databaseType; } DataSource对象中的databaseType属性,可以通过hibernate中的@Enumerated注解实现很好的映射,保存到数据库中的值,是枚举类型的下标,从0开始。有些同学使用的是spring mvc,而spring mvc没有提供对枚举类型的自动转换功能,我们要如何处理呢?当然,是要定义自己的属性转换器了,代码如下: class DatabaseTypeEnumEditor extends PropertyEditorSupport { @Override public void setAsText(String text) throws IllegalArgumentException { int val = Integer.parseInt(text); boolean found = false; for (DatabaseType d : DatabaseType.values()) { if (val == d.ordinal()) { this.setValue(d); found = true; break; } } if (found == false) { //错误的取值,我们默认为oracle类型,当然你也可以throws exception this.setValue(DatabaseType.oracle); } } } } 最后将这个属性转换器注册到spring mvc的这个action上: @InitBinder protected void initBinder(HttpServletRequest request, ServletRequestDataBinder binder) throws Exception { binder.registerCustomEditor(Date.class, dateEditor); binder.registerCustomEditor(DatabaseType.class, new DatabaseTypeEnumEditor()); } 最后说一下jackson在对enum进行转换时,默认情况下得到的是枚举字符串,如果想得到其底层的真实值(即和hibernate持久化的值保持一致),需要打开这个开关: ObjectMapper om = new ObjectMapper(); |
|