spring boot 枚舉使用的坑2


上一篇說到在枚舉當在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());
    }
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM