在我们使用SpringCloud服务框架中,可以根据我们自己的需要进行定义数据报文传输的格式;
spirngcloud中默认使用的是jackson 库 ,我们可以对它进行拓展和自定义。
我们可以通过注解获取现有已经实例化好的ObjectMapper对象。
/**
* 系统默认的映射关系类
*/
@Autowired
ObjectMapper objectMapper;
此代码可以定义到配置文件中,在需要的地方定义。然后我们可以对其进行拓展和更新。
/**
* 配置feign调用的解码器
*
* @return @Decoder
*/
@Bean
public Decoder feignDecoder() {
log.info("================= 初始化 feignDecoder ");
// 放弃系统默认的配置,重新初始化一个,根据后续的需要进行自定义
// PlatFormMessageConverter platConverter = new PlatFormMessageConverter(objectMapper);
// ObjectMapper mapper = new ObjectMapper();
JsonMapper.builder().disable(MapperFeature.IGNORE_DUPLICATE_MODULE_REGISTRATIONS);
// 2.13.0之后的版本会禁用,我们目前还有部分在使用,使用一段时间在进行删除
objectMapper.disable(MapperFeature.IGNORE_DUPLICATE_MODULE_REGISTRATIONS);
log.debug("放弃系统默认的配置,重新初始化一个,根据后续的需要进行自定义 at BaseConfig");
PlatFormMessageConverter platConverter = new PlatFormMessageConverter(objectMapper);
ObjectFactory<HttpMessageConverters> objectFactory = () -> new HttpMessageConverters(platConverter);
// JsonMapper.builder().enable(MapperFeature.IGNORE_DUPLICATE_MODULE_REGISTRATIONS);
return new SpringDecoder(objectFactory);
}
@Bean
public Encoder feignEncoder() {
log.info("================= 初始化 feignEncoder ");
// PlatFormMessageConverter platConverter = new PlatFormMessageConverter(objectMapper);
// ObjectMapper mapper = new ObjectMapper();
JsonMapper.builder().disable(MapperFeature.IGNORE_DUPLICATE_MODULE_REGISTRATIONS);
// 2.13.0之后的版本会禁用,我们目前还有部分在使用,使用一段时间在进行删除
objectMapper.disable(MapperFeature.IGNORE_DUPLICATE_MODULE_REGISTRATIONS);
PlatFormMessageConverter platConverter = new PlatFormMessageConverter(objectMapper);
ObjectFactory<HttpMessageConverters> objectFactory = () -> new HttpMessageConverters(platConverter);
// JsonMapper.builder().enable(MapperFeature.IGNORE_DUPLICATE_MODULE_REGISTRATIONS);
return new SpringEncoder(objectFactory);
}
在2.13.0以后的版本中,objectMapper.disable(MapperFeature)方法已经过期了,可以使用JsonMapper.builder().disable(MapperFeature.IGNORE_DUPLICATE_MODULE_REGISTRATIONS); 来替换。
考虑现在还在过度阶段,还有很多lib库使用的还是旧版本,我两种方式都使用了 。
其中 JsonMapper.builder().disable(MapperFeature.IGNORE_DUPLICATE_MODULE_REGISTRATIONS); 很关键,系统已经包含了默认的日期处理的实例,如果我们要替换的话,必须支持更新。
PlatFormMessageConverter配置内容如下:
import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializationFeature;
import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;
import lombok.extern.slf4j.Slf4j;
import org.springframework.http.MediaType;
import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;
import java.nio.charset.Charset;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.util.ArrayList;
import java.util.List;
@Slf4j
public class PlatFormMessageConverter extends MappingJackson2HttpMessageConverter {
/**
* 实例化信息转换方法
*/
public PlatFormMessageConverter() {
List<MediaType> mediaTypes = new ArrayList<>();
mediaTypes.add(MediaType.APPLICATION_JSON);
mediaTypes.add(MediaType.APPLICATION_FORM_URLENCODED);
mediaTypes.add(MediaType.APPLICATION_ATOM_XML);
mediaTypes.add(MediaType.MULTIPART_FORM_DATA);
log.info("--> 初始化设置 mediaTypes {} ,pub 中的配置,单个工程中就不用再次进行配置 ", mediaTypes);
setSupportedMediaTypes(mediaTypes);
}
/**
* 实例化信息转换方法,需要objecktMapper的支持
*
* @param objectMapper
*/
public PlatFormMessageConverter(ObjectMapper objectMapper) {
List<MediaType> mediaTypes = new ArrayList<>();
mediaTypes.add(MediaType.APPLICATION_JSON);
mediaTypes.add(MediaType.APPLICATION_FORM_URLENCODED);
mediaTypes.add(MediaType.APPLICATION_ATOM_XML);
mediaTypes.add(MediaType.MULTIPART_FORM_DATA);
log.info("--> 初始化设置 mediaTypes {} ,pub 中的配置,单个工程中就不用再次进行配置 ", mediaTypes);
setSupportedMediaTypes(mediaTypes);
log.info("--> 初始化设置 objectMapper ,pub 中的配置,单个工程中就不用再次进行配置 ");
setObjectMapper(assembleObjectMapper(objectMapper));
log.info("--> 初始化设置 defaultCharset {}", Charset.defaultCharset());
setDefaultCharset(Charset.defaultCharset());
}
/**
* 初始化Json对象映射服务对象
*
* @return
*/
public ObjectMapper assembleObjectMapper(ObjectMapper objectMapper) {
objectMapper = this.registerModule(objectMapper);
JacksonUtil.setObjectMapper(objectMapper);
return objectMapper;
}
/**
* 初始化内容,和设置默认的
*
* @param objectMapper 映射对象
* @return ObjectMapper
*/
public ObjectMapper registerModule(ObjectMapper objectMapper) {
objectMapper = (objectMapper == null ? new ObjectMapper() : objectMapper);
log.info("--> init objectMapper for jackson ");
objectMapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);
objectMapper.disable(DeserializationFeature.ADJUST_DATES_TO_CONTEXT_TIME_ZONE);
objectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
// 按照系统的默认配置,取消null 返回值的配置,没有值 就不给前段进行送
// objectMapper.configure(DeserializationFeature.ACCEPT_EMPTY_STRING_AS_NULL_OBJECT, true);
//美化json字符串打印输出
//objectMapper.enable(SerializationFeature.INDENT_OUTPUT);
// json数据中添加数据的格式类型,@class=java.lang.String
// objectMapper.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL, JsonTypeInfo.As.PROPERTY);
JavaTimeModule javaTimeModule = new JavaTimeModule();
javaTimeModule.addSerializer(LocalDateTime.class, new LocalDateTimeSerializer(DateFormatConstants.DATE_TIME_OIL_FORMATTER));
javaTimeModule.addSerializer(LocalDate.class, new LocalDateSerializer(DateFormatConstants.DATE_OIL_FORMATTER));
javaTimeModule.addSerializer(LocalTime.class, new LocalTimeSerializer(DateFormatConstants.TIME_OIL_FORMATTER));
javaTimeModule.addDeserializer(LocalDateTime.class, new LocalDateTimeDeserializer(DateFormatConstants.DATE_TIME_OIL_FORMATTER));
javaTimeModule.addDeserializer(LocalDate.class, new LocalDateDeserializer(DateFormatConstants.DATE_OIL_FORMATTER));
javaTimeModule.addDeserializer(LocalTime.class, new LocalTimeDeserializer(DateFormatConstants.TIME_OIL_FORMATTER));
objectMapper.registerModule(javaTimeModule);
return objectMapper;
}
}
其中 JacksonUtil 是拓展工具类的一种设置的方式,如果有需要可以自行定义,如果不需要删除即可。
大家可以参考