上一篇說到在枚舉當在controller的方法做參數時的坑,解決方法是配置了一個converter,后來想想,如果不閑每次都加一個注解麻煩的話,可以在參數前面加一個注解,添加一個解析器應該也可以解決這個問題。
現在來說說枚舉的第二個坑,前提條件和上一篇的一樣:就是這個枚舉:
@Getter @AllArgsConstructor public enum EnumExpenseType implements BaseEnum { 小歡喜(1), 大歡喜(2); private final int value; }
現在還是把它當參數,但是是做為一個復雜對象的屬性來傳,這個復雜對象是通過jackjson反序列化得到的。
就是前端傳過來一個json串,我們在controller中把它反序列化對象。
就不演示了,直接說結論了,jackson默認是使用索引值ordinal來做映射的,所以還是不能滿足我們的需求。
所以不是修改jackson的配置,或對每個枚舉做修改,添加一個@JsonCreator,我還是喜歡統一的配置,
直接上代碼:
/** * 解決BaseEnum接收前端json時,應按照value值進行處理,實際是按照索引值處理 */ @JsonComponent public class BaseEnumDeserializer extends JsonDeserializer<BaseEnum> { @Override public BaseEnum deserialize(JsonParser jp, DeserializationContext ctxt) throws IOException, JsonProcessingException { JsonNode node = jp.getCodec().readTree(jp); String currentName = jp.currentName(); Object currentValue = jp.getCurrentValue(); Class findPropertyType = BeanUtils.findPropertyType(currentName, currentValue.getClass()); BaseEnum b = EnumUtil.getEnumByValue(findPropertyType, node.intValue()); return b; } }
/** * @author :hkk */ public class AuditHttpMessageConverter extends MappingJackson2HttpMessageConverter { public AuditHttpMessageConverter(ObjectMapper objectMapper) { SimpleModule simpleModule1 = new SimpleModule(); simpleModule1.addDeserializer(BaseEnum.class, new BaseEnumDeserializer()); objectMapper.registerModule(simpleModule1); super.setObjectMapper(objectMapper); } }
再配置一個webmvcconfig:
@Override public void extendMessageConverters(List<HttpMessageConverter<?>> converters) { //替換自帶json序列化器 MappingJackson2HttpMessageConverter converter; Iterator<HttpMessageConverter<?>> it = converters.iterator(); while (it.hasNext()) { if (ClassUtils.isAssignable(it.next().getClass(), MappingJackson2HttpMessageConverter.class)) { it.remove(); } } converters.add(new MappingJackson2HttpMessageConverter(objectMapper));//BaseEnum反序列化支持 converters.add(new AuditHttpMessageConverter(builder.build())); }
配置完成。
這是反序列化,那序列化還是有問題,可以在value上打個注解@jsonValue,但如果閑麻煩的話,可以做一個統一的配置, 直接上代碼:
/** * BaseEnum及子類,序列化成json時,指定序列值為getvalue*/ @JsonComponent public class BaseEnumSerializer extends JsonSerializer<BaseEnum> { @Override public void serialize(BaseEnum value, JsonGenerator gen, SerializerProvider serializers) throws IOException { gen.writeNumber(value.getValue()); } }