1.前言
最近在开发过程中,自测自己的接口的时候,会出现一下驼峰与下划线转换问题,今天就出篇文章写下吧,顺便加深下印象
2.步骤
2.1导入maven依赖
注意:因为我的项目中引入了Redisson的依赖,所以就不用单独引入jackson依赖了(这是个坑,第一次我也踩了,大佬忽喷......)
2.2 项目结构
GlobalAutoConfig.java
@Slf4j
@Configuration
public class GlobalAutoConfig {
@Bean
public ObjectMapper objectMapper(Jackson2ObjectMapperBuilder builder) {
ObjectMapper objectMapper = builder.createXmlMapper(false).build();
SimpleModule jacksonModule = new SimpleModule();
jacksonModule.addSerializer(Long.class, ToStringSerializer.instance);
jacksonModule.addSerializer(Long.TYPE, ToStringSerializer.instance);
jacksonModule.addSerializer(BigInteger.class, ToStringSerializer.instance);
jacksonModule.addSerializer(BigDecimal.class, ToStringSerializer.instance);
return objectMapper
// 时区
.setTimeZone(TimeZone.getTimeZone(ZoneId.systemDefault()))
// 默认的时间戳格式
.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, true)
// 该特性决定parser是否允许JSON字符串包含非引号控制字符(值小于32的ASCII字符,包含制表符和换行符)。
// 如果该属性关闭,则如果遇到这些字符,则会抛出异常。JSON标准说明书要求所有控制符必须使用引号,因此这是一个非标准的特性
.configure(JsonReadFeature.ALLOW_UNESCAPED_CONTROL_CHARS.mappedFeature(), true)
// 忽略不能转移的字符
.configure(JsonReadFeature.ALLOW_BACKSLASH_ESCAPING_ANY_CHARACTER.mappedFeature(), true)
// 在使用spring boot + jpa/hibernate,如果实体字段上加有FetchType.LAZY,并使用jackson序列化为json串时,会遇到SerializationFeature.FAIL_ON_EMPTY_BEANS异常
.configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false)
// 忽略未知字段
.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false)
// 单引号处理
.configure(JsonParser.Feature.ALLOW_SINGLE_QUOTES, true)
// 字段排序
.configure(SerializationFeature.ORDER_MAP_ENTRIES_BY_KEYS, true)
// 失败处理
.configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false)
.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false)
// 引用前人写好的序列化/反序列化规则
.registerModule(new Jdk8Module())
.registerModule(new JavaTimeModule())
// 自定义序列化/反序列化规则
.registerModule(jacksonModule)
// 输出非空字段
.setSerializationInclusion(JsonInclude.Include.NON_NULL)
//开启驼峰映射
.setPropertyNamingStrategy(PropertyNamingStrategy.SNAKE_CASE)
.findAndRegisterModules();
}
}
BaseResp.java
/**
* 通用结果返回
* @param <T>
*/
@Data
@Builder
@Accessors(chain = true)
@AllArgsConstructor
@NoArgsConstructor
public class BaseResp<T> implements Serializable {
private Integer code;
private String msg;
private T data;
/**
* 返回成功消息
*
* @param msg 返回内容
* @return 成功消息
*/
public static BaseResp<Void> success(String msg) {
return BaseResp.success(msg, null);
}
/**
* 返回成功消息
*
* @param msg 返回内容
* @param data 数据对象
* @return 成功消息
*/
public static <T> BaseResp<T> success(String msg, T data) {
return new BaseResp<T>(HttpStatus.OK.value(), msg, data);
}
/**
* 返回成功消息
*
* @param data 数据对象
* @return 成功消息
*/
public static <T> BaseResp<T> success(T data) {
return BaseResp.success("success", data);
}
/**
* 返回错误消息
*
* @return
*/
public static BaseResp<Void> error() {
return BaseResp.error("error");
}
/**
* 返回错误消息
*
* @param msg 返回内容
* @return 警告消息
*/
public static BaseResp<Void> error(String msg) {
return BaseResp.error(msg, null);
}
/**
* 返回错误消息
*
* @param msg 返回内容
* @param data 数据对象
* @return 警告消息
*/
public static <T> BaseResp<T> error(String msg, T data) {
return new BaseResp<T>(HttpStatus.INTERNAL_SERVER_ERROR.value(), msg, data);
}
/**
* 返回错误消息
*
* @param code 状态码
* @param msg 返回内容
* @return 警告消息
*/
public static BaseResp<Void> error(int code, String msg) {
return new BaseResp<Void>(HttpStatus.INTERNAL_SERVER_ERROR.value(), msg, null);
}
/**
* 返回错误消息
*
* @param code 状态码
* @param msg 返回内容
* @return 警告消息
*/
public static <T> BaseResp<T> error(int code, String msg, T data) {
return new BaseResp<T>(HttpStatus.INTERNAL_SERVER_ERROR.value(), msg, data);
}
}
UserDTO.java
@Data
public class UserDTO implements Serializable {
private String userName;
private String name;
private String age;
}
controller.java
/**
* @author xiaozhou
* @date 2023/3/10
* <p>
* </p>
*/
@Slf4j
@RestController
@RequestMapping("/interceptor")
public class InterController {
@PostMapping("/test")
public BaseResp test(@RequestBody UserDTO userDTO) {
log.info("请求:{}", JSONUtil.toJsonStr(userDTO));
return BaseResp.success(userDTO);
}
}
3.效果
启动项目.....