枚举类型可以增强代码的可读性和健壮性,在项目中有广泛的使用,比如,我们有一个代码数据库类型的枚举:
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);