分享

enum枚举类型在spring mvc中的转换

 roydocs 2013-10-11

枚举类型可以增强代码的可读性和健壮性,在项目中有广泛的使用,比如,我们有一个代码数据库类型的枚举:

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();
om.configure(Feature.WRITE_ENUMS_USING_INDEX, true);


    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多