feat: aos-web

增加全局jackson处理器
This commit is contained in:
王永亮
2022-11-16 17:32:14 +08:00
parent 293d98b151
commit f25478c4a5
9 changed files with 148 additions and 1 deletions
@@ -13,6 +13,7 @@ import java.util.function.Supplier;
* @date: 2022/11/6
* @description: 拷贝
*/
@SuppressWarnings("unchecked")
public class AosBeanUtils extends BeanUtils {
/**
@@ -0,0 +1,28 @@
package com.aos.common.model;
/**
* @author: wangyl
* @date: 2022/11/16
* @description: 枚举基础接口
*/
public interface AosBaseEnum {
/**
* 获取枚举值
*
* @param
* @return java.lang.Integer
* @Date 2022/11/16
* @Author wangyl
*/
Integer getValue();
/**
* 获取枚举描述
*
* @param
* @return java.lang.String
* @Date 2022/11/16
* @Author wangyl
*/
String getDesc();
}
@@ -4,6 +4,7 @@ import com.aos.common.model.ResultCodeInterface;
import lombok.AllArgsConstructor;
@AllArgsConstructor
@SuppressWarnings("unchecked")
public enum WebResponse {
/**
*
@@ -12,6 +12,7 @@ import java.util.List;
* @Function: 建立树型结构
* @Date: 2019/9/24 14:28
*/
@SuppressWarnings("unchecked")
public class TreeUtil<T extends TreeNode> {
/**
* @Description 建立树
+12
View File
@@ -54,5 +54,17 @@
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-autoconfigure</artifactId>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.datatype</groupId>
<artifactId>jackson-datatype-jsr310</artifactId>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.module</groupId>
<artifactId>jackson-module-parameter-names</artifactId>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.datatype</groupId>
<artifactId>jackson-datatype-jdk8</artifactId>
</dependency>
</dependencies>
</project>
@@ -1,7 +1,9 @@
package com.aos.web.conf;
import com.aos.web.filter.BodyRepeatReaderHttpServletFilter;
import com.aos.web.jackson.AosJacksonBuilderCustomizer;
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.boot.autoconfigure.jackson.Jackson2ObjectMapperBuilderCustomizer;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
@@ -33,4 +35,9 @@ public class AosWebAutoConf {
public BodyRepeatReaderHttpServletFilter bodyRepeatReaderHttpServletFilter() {
return new BodyRepeatReaderHttpServletFilter();
}
@Bean("jackson2ObjectMapperBuilderCustomizer")
public Jackson2ObjectMapperBuilderCustomizer customizer() {
return new AosJacksonBuilderCustomizer();
}
}
@@ -1,9 +1,32 @@
package com.aos.web.jackson;
import cn.hutool.core.date.DatePattern;
import com.aos.web.jackson.component.BigDecimalSerializer;
import com.aos.web.jackson.component.StringSerializer;
import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.SerializationFeature;
import com.fasterxml.jackson.databind.deser.std.NumberDeserializers;
import com.fasterxml.jackson.databind.introspect.JacksonAnnotationIntrospector;
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
import com.fasterxml.jackson.datatype.jdk8.Jdk8Module;
import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;
import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateDeserializer;
import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateTimeDeserializer;
import com.fasterxml.jackson.datatype.jsr310.deser.LocalTimeDeserializer;
import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateSerializer;
import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateTimeSerializer;
import com.fasterxml.jackson.datatype.jsr310.ser.LocalTimeSerializer;
import com.fasterxml.jackson.module.paramnames.ParameterNamesModule;
import org.springframework.boot.autoconfigure.jackson.Jackson2ObjectMapperBuilderCustomizer;
import org.springframework.core.Ordered;
import org.springframework.http.converter.json.Jackson2ObjectMapperBuilder;
import java.math.BigDecimal;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;
public class AosJacksonBuilderCustomizer implements Jackson2ObjectMapperBuilderCustomizer, Ordered {
/**
* Customize the JacksonObjectMapperBuilder.
@@ -12,7 +35,39 @@ public class AosJacksonBuilderCustomizer implements Jackson2ObjectMapperBuilderC
*/
@Override
public void customize(Jackson2ObjectMapperBuilder jacksonObjectMapperBuilder) {
jacksonObjectMapperBuilder.failOnUnknownProperties(false);
jacksonObjectMapperBuilder.defaultUseWrapper(true);
/**
* 时间类型系列化/反序列化
*/
jacksonObjectMapperBuilder.serializerByType(LocalDateTime.class, new LocalDateTimeSerializer(DatePattern.NORM_DATETIME_FORMATTER));
jacksonObjectMapperBuilder.serializerByType(LocalDate.class, new LocalDateSerializer(DatePattern.NORM_DATE_FORMATTER));
jacksonObjectMapperBuilder.serializerByType(LocalTime.class, new LocalTimeSerializer(DatePattern.NORM_TIME_FORMATTER));
jacksonObjectMapperBuilder.deserializerByType(LocalDateTime.class, new LocalDateTimeDeserializer(DatePattern.NORM_DATETIME_FORMATTER));
jacksonObjectMapperBuilder.deserializerByType(LocalDate.class, new LocalDateDeserializer(DatePattern.NORM_DATE_FORMATTER));
jacksonObjectMapperBuilder.deserializerByType(LocalTime.class, new LocalTimeDeserializer(DatePattern.NORM_TIME_FORMATTER));
/**
* Long类型的序列化/反序列化
*/
jacksonObjectMapperBuilder.serializerByType(Long.class, ToStringSerializer.instance);
jacksonObjectMapperBuilder.serializerByType(Long.TYPE, ToStringSerializer.instance);
jacksonObjectMapperBuilder.deserializerByType(Long.TYPE, new NumberDeserializers.LongDeserializer(Long.TYPE, 0L));
jacksonObjectMapperBuilder.deserializerByType(Long.class, new NumberDeserializers.LongDeserializer(Long.class, null));
/**
* BigDecimal序列化去除多余0,String反序列化去除多余的空格
*/
jacksonObjectMapperBuilder.serializerByType(BigDecimal.class, new BigDecimalSerializer());
jacksonObjectMapperBuilder.deserializerByType(String.class, new StringSerializer());
/**
* 增加java 8 新属性支持 增加自动匹配构造函数支持
*/
jacksonObjectMapperBuilder.modules(new JavaTimeModule(), new ParameterNamesModule(), new Jdk8Module());
jacksonObjectMapperBuilder.featuresToEnable(JsonGenerator.Feature.WRITE_BIGDECIMAL_AS_PLAIN);
jacksonObjectMapperBuilder.featuresToEnable(DeserializationFeature.USE_BIG_DECIMAL_FOR_FLOATS);
jacksonObjectMapperBuilder.featuresToDisable(SerializationFeature.FAIL_ON_EMPTY_BEANS);
jacksonObjectMapperBuilder.featuresToDisable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);
jacksonObjectMapperBuilder.featuresToDisable(SerializationFeature.WRITE_DURATIONS_AS_TIMESTAMPS);
jacksonObjectMapperBuilder.annotationIntrospector(new JacksonAnnotationIntrospector());
}
/**
@@ -0,0 +1,22 @@
package com.aos.web.jackson.component;
import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.databind.JsonSerializer;
import com.fasterxml.jackson.databind.SerializerProvider;
import java.io.IOException;
import java.math.BigDecimal;
/**
* @author: wangyl
* @date: 2022/11/16
* @description: BigDecimal修改为String, 去除多余的0
*/
public class BigDecimalSerializer extends JsonSerializer<BigDecimal> {
@Override
public void serialize(BigDecimal bigDecimal, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException {
jsonGenerator.writeString(bigDecimal.stripTrailingZeros().toPlainString());
}
}
@@ -0,0 +1,20 @@
package com.aos.web.jackson.component;
import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.databind.DeserializationContext;
import com.fasterxml.jackson.databind.deser.std.StringDeserializer;
import java.io.IOException;
/**
* @author: wangyl
* @date: 2022/11/16
* @description: String去除多余的空格
*/
public class StringSerializer extends StringDeserializer {
@Override
public String deserialize(JsonParser p, DeserializationContext ctxt) throws IOException {
String value = super.deserialize(p, ctxt);
return value == null ? null : value.trim();
}
}