背景
- 新团队里有一个项目,关于出参和入参端规定是:端上传过来端是下划线标记,如:user_name,后端在Controller层用Query对象接收,然后Controller调用Service,需要将Query转成AO,所有VO出参也须转成下划线格式。
- 我习惯于用驼峰命名,问了问小伙伴,他们有的通过get和set互换,有的通过注解实现。我自己捣鼓了一下,嘿嘿,统一配置实现了。 记录一下,万一以后用到了,可以抄自己的笔记。
单纯的Long转String
/**
* 处理long格式精度缺失问题
*/
@Configuration
public class LongToStringJsonConfig implements WebMvcConfigurer {
public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
MappingJackson2HttpMessageConverter jackson2HttpMessageConverter = new MappingJackson2HttpMessageConverter();
ObjectMapper objectMapper = new ObjectMapper();
SimpleModule simpleModule = new SimpleModule();
simpleModule.addSerializer(Long.class, ToStringSerializer.instance);
simpleModule.addSerializer(Long.TYPE, ToStringSerializer.instance);
objectMapper.registerModule(simpleModule);
jackson2HttpMessageConverter.setObjectMapper(objectMapper);
converters.add(jackson2HttpMessageConverter);
}
}
- 在处理这一步的时候,还引发了一个导致我接口空响应的血案。这个回头再说。
驼峰和下划线的互转
@Configuration
public class ParamAutoConfiguration {
@Bean
@Primary
@ConditionalOnMissingBean(ObjectMapper.class)
public ObjectMapper jacksonObjectMapper(Jackson2ObjectMapperBuilder builder) {
ObjectMapper mapper = builder.createXmlMapper(false).build();
/**
* ALWAYS 默认 null 会被序列化
* NON_DEFAULT 属性为默认值不序列化
* NON_EMPTY 属性为 空("") 或者为 NULL 都不序列化,则返回的json是没有这个字段的。
* NON_NULL 属性为NULL 不序列化
*/
mapper.setSerializationInclusion(JsonInclude.Include.ALWAYS);
mapper.setPropertyNamingStrategy(PropertyNamingStrategy.SNAKE_CASE);
SimpleModule simpleModule =new SimpleModule();
simpleModule.addSerializer(Long.class, ToStringSerializer.instance);
simpleModule.addSerializer(Long.TYPE, ToStringSerializer.instance);
mapper.registerModule(simpleModule);
//空对象
mapper.configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false);
return mapper;
}
}
- 如上配置之后,就可以在后端按照我自己的习惯定义为驼峰,而能接收和返回端上需要的下划线格式。 而对于一些特殊的自定义需求,比如我一个小伙伴说之前有和客户端的约定是又有驼峰又有下划线。这个需要分别单独处理
请求参数穿插了驼峰
- 如下设置, 就能接住端上传过来的参数,一堆下划线里又有驼峰的这种场景。加上别名,端上传啥都行。
@JsonAlias("userName")
private String userName;
返回参数里添加驼峰
- 如下设置,就可以将指定参数转成驼峰而不是根据统一配置转成下划线
@JsonProperty("userName")
private String userName;
- 不要问为啥规定这么奇怪,侬也不知道啊。也不是说哪个规定对或是不对,就是记录一下在这样对场景下,怎么去统一妥善的处理。