在我们应用中我们通常与前端交互使用json 格式,设置统一的返回json 格式是非常必要的,可以减少开发人员的工作量。
第一个使用统一的消息转换器,这里使用jackson 的相关功能,引入jar
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
</dependency>
创建一个全局配置类(GlobalConfig)并使用@Configuration
注解标记该类为配置类。然后,在该类上使用@EnableWebMvc
注解开启对MVC的支持。
在该配置类中重写configureMessageConverters()
方法,将Jackson消息转换器添加到默认的消息转换器列表中。示例如下所示:
@Configuration
@EnableWebMvc
public class GlobalConfig extends WebMvcConfigurerAdapter {
@Override
public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
ObjectMapper objectMapper = new ObjectMapper();
// 设置日期序列化/反序列化格式
JavaTimeModule javaTimeModule = new JavaTimeModule();
javaTimeModule.addSerializer(LocalDateTime.class, LocalDateTimeSerializer.INSTANCE);
javaTimeModule.addDeserializer(LocalDateTime.class, LocalDateTimeDeserializer.INSTANCE);
objectMapper.registerModule(javaTimeModule);
// 其他自定义配置...
Jackson2ObjectMapperBuilder builder = new Jackson2ObjectMapperBuilder()
.serializationInclusion(JsonInclude.Include.NON_NULL)
.featuresToDisable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);
MappingJackson2HttpMessageConverter converter = new MappingJackson2HttpMessageConverter(builder.build());
converters.add(converter);
}
}
二、声明统一格式的返回类型,一般包含code、message、data 三部分
1)定义一个返回结果 IResultStatus
public interface IResultStatus {
/**
* 业务状态码
* @return Integer
*/
Integer code();
/**
* 业务信息描述
* @return String
*/
String message();
}
2)创建一个枚举实体
public enum ResultStatus implements IResultStatus {
/**
* 成功
*/
SUCCESS(200, "OK"),
/**
* 错误的请求,参数异常
*/
BAD_REQUEST(400, "Bad Request params exception"),
/**
* 服务器异常
*/
INTERNAL_SERVER_ERROR(500, "Internal Server Error"),
/**
* 401 未认证异常
*/
UNAUTHORIZED(401, "认证异常"),
/**
* 业务异常
*/
BUSINESS_ERR(10000, "业务异常");
/**
* 业务状态码
*/
private Integer code;
/**
* 业务信息描述
*/
private String message;
ResultStatus (Integer code, String message) {
this.code = code;
this.message = message;
}
/**
* 业务状态码
*
* @return Integer
*/
@Override
public Integer code() {
return code;
}
/**
* 业务信息描述
*
* @return String
*/
@Override
public String message() {
return message;
}
}
3)引入lamada 定义返回实体
@Data
public class Result<T> {
/**
* 业务错误码
*/
private Integer code;
/**
* 信息描述
*/
private String message;
/**
* 返回参数
*/
private T data;
private Result(IResultStatus resultStatus, T data) {
this.code = resultStatus.code();
this.message = resultStatus.message();
this.data = data;
}
private Result(Integer code, String message, T data) {
this.code = code;
this.message = message;
this.data = data;
}
/**
* 业务成功返回业务代码和描述信息
*/
public static Result<Void> success() {
return new Result<Void>(ResultStatus.SUCCESS, null);
}
/**
* 业务成功返回业务代码,描述和返回的参数
*/
public static <T> Result<T> success(T data) {
return new Result<T>(ResultStatus.SUCCESS, data);
}
/**
* 业务成功返回业务代码,描述和返回的参数
*/
public static <T> Result<T> success(IResultStatus resultStatus, T data) {
if (resultStatus == null) {
return success(data);
}
return new Result<T>(resultStatus, data);
}
/**
* 业务成功返回业务代码,描述和返回的参数
*/
public static <T> Result<T> success(Integer code, String message, T data) {
return new Result<T>(code, message, data);
}
/**
* 业务异常返回业务代码和描述信息
*/
public static <T> Result<T> fail() {
return new Result<T>(ResultStatus.BUSINESS_ERR, null);
}
/**
* 业务异常返回业务代码和描述信息
*/
public static <T> Result<T> fail(String message) {
return new Result<T>(ResultStatus.BUSINESS_ERR.code(), message, null);
}
/**
* 业务异常返回业务代码,描述和返回的参数
*/
public static <T> Result<T> fail(IResultStatus resultStatus) {
return fail(resultStatus, null);
}
/**
* 业务异常返回业务代码,描述和返回的参数
*/
public static <T> Result<T> fail(IResultStatus resultStatus, String message) {
if (resultStatus == null) {
return new Result<T>(ResultStatus.BUSINESS_ERR, null);
}
return new Result<T>(resultStatus.code(), message, null);
}
}
上述实体我们都定义好了,可以结合我们的上述jackson 包进行配置json 配置
@Configuration
public class JsonSerializeConfig {
@Bean
@Primary
@ConditionalOnMissingBean(ObjectMapper.class)
public ObjectMapper jacksonObjectMapper(Jackson2ObjectMapperBuilder builder) {
ObjectMapper objectMapper = builder.createXmlMapper(false).build();
.....这里省去自定义格式类型
}
}
那么在使用时通过创建我们的返回实体进行接口返回。
public Result<> call((){
.......省去业务
return new Result();//根据构造函数返回
}