既是对程序处理的结果进行统一的返回格式,方便前端人员方便解析数据和处理数据。
1.创建统一返回值的格式dao类
2.创建拦截返回值的增强类
3.处理中文乱码问题
4.创建controller类进行测试
1.创建统一返回值的格式dao类
public class ResultUtils<T> {
private int code;
private String msg;
private T Data;
public static <T>ResultUtils<T> sucess(String msg) {
ResultUtils<T> result = new ResultUtils<T>();
result.setCode(200);
result.setMsg(msg);
return result;
}
public static <T>ResultUtils<T> sucess(String msg, T data) {
ResultUtils<T> result = new ResultUtils<T>();
result.setCode(200);
result.setMsg(msg);
result.setData(data);
return result;
}
public static <T>ResultUtils<T> fail(String msg) {
ResultUtils<T> result = new ResultUtils<T>();
result.setCode(400);
result.setMsg(msg);
return result;
}
public static <T>ResultUtils<T> fail(String msg, T data) {
ResultUtils<T> result = new ResultUtils<T>();
result.setCode(400);
result.setMsg(msg);
result.setData(data);
return result;
}
// getter,setter方法类
这里面主要定义数据返回的格式,主要给前端好判断是否返回成功了,返回的哪些是数据,哪些是提醒等。
2.创建拦截返回值的增强类
@RestControllerAdvice
public class ResultAdvice implements ResponseBodyAdvice<Object> {
@Override
public boolean supports(MethodParameter returnType, Class<? extends HttpMessageConverter<?>> converterType) {
if(returnType.getGenericParameterType().equals(ResultUtils.class)) {
return false;//返回值类型已经是正确了
}
return true;
}
@Override
public Object beforeBodyWrite(Object body, MethodParameter returnType, MediaType selectedContentType,
Class<? extends HttpMessageConverter<?>> selectedConverterType, ServerHttpRequest request,
ServerHttpResponse response) {
if(ObjectUtils.isEmpty(body)) {
return JSON.toJSONString(ResultUtils.sucess("成功"));
}
return JSON.toJSONString(ResultUtils.sucess("成功",body));
}
}
返回增强类,需要主要两点,1.需要使用@RestControllerAdvice注解对所有的返回值进行增强处理,2.该类需要实现ResponseBodyAdvice接口进行数据返回前端之前进行增强处理。
supports():方法的返回值类型进行判断是否需要进行增强处理,返回false不需要增强,true表示需要增强处理。
beforeBodyWrite():该方法既是对返回值的增强处理,注意需要返回的是json格式的字符串类型,否则的话会出现java.lang.ClassCastException(java强制类型转换异常)报错。
3.处理中文乱码问题
@Configuration
public class WebMvcConfigurer extends WebMvcConfigurationSupport {
/**
* 发现如果继承了WebMvcConfigurationSupport,则在yml中配置的相关内容会失效。 需要重新指定静态资源
*/
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/**").addResourceLocations("classpath:/static/");
registry.addResourceHandler("swagger-ui.html", "doc.html")
.addResourceLocations("classpath:/META-INF/resources/");
registry.addResourceHandler("/webjars/**").addResourceLocations("classpath:/META-INF/resources/webjars/");
super.addResourceHandlers(registry);
}
/**
* 输出中文乱码问题
*/
@Override
protected void extendMessageConverters(List<HttpMessageConverter<?>> converters) {
for (HttpMessageConverter<?> converter : converters) {
if (converter instanceof StringHttpMessageConverter) {
((StringHttpMessageConverter) converter).setDefaultCharset(StandardCharsets.UTF_8); // 将StringHttpMessageConverter改为utf-8
}
}
super.extendMessageConverters(converters);
}
}
springboot默认返回的格式是iso-8859-1格式的,返回中文就会乱码,所以需要在MVC进行编码这个extendMessageConverters()方法中的处理字符串的转换器,把他设置为UTF-8的格式。
(似乎也可以直接生产一个bean替换HttpMessageConverter这个bean)。
4.创建controller类进行测试
@RequestMapping("/t")
public String tt() {
return "测试是否返回成功啊";
}
4.展示测试效果
{"code":200,"data":"测试是否返回成功啊","msg":"成功"}
5.统一异常处理
@ExceptionHandler(Exception.class)
public ResultUtils exceptionHandler(Exception e) {
e.printStackTrace();
return ResultUtils.fail("出错了", e.getMessage());
}
即是在上面的基础上,在定义一个处理异常的方法。需要添加@ExceptionHandler注解,这个异常也是返回给前端的一个标准的格式而已