首先 定义统一回复对象,公用
package com.hangzhou.ad.vo;
import java.io.Serializable;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@NoArgsConstructor
@AllArgsConstructor
public class CommonResponse<T> implements Serializable{
private Integer code;
private String message;
private T dateT;
public CommonResponse(Integer code, String message) {
this.code = code;
this.message = message;
}
}
一 .统一响应服务
@RestControllerAdvice //控制器增强,拦截响应
ResponseBodyAdvice //接口,控制对那些响应,以及做哪些处理
package com.hangzhou.ad.advice;
import org.springframework.core.MethodParameter;
import org.springframework.http.MediaType;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.http.server.ServerHttpRequest;
import org.springframework.http.server.ServerHttpResponse;
import org.springframework.web.bind.annotation.RestControllerAdvice;
import org.springframework.web.servlet.mvc.method.annotation.ResponseBodyAdvice;
import com.hangzhou.ad.annotation.IgnoreResponseAdvice;
import com.hangzhou.ad.vo.CommonResponse;
/**
* 统一回应方法
* @author Administrator
*
*/
@RestControllerAdvice
public class CommonResponseDateAdvice implements ResponseBodyAdvice<Object>{
@Override
public boolean supports(MethodParameter returnType,Class<? extends HttpMessageConverter<?>> converterType) {
//returnType。getDeclaringClass() 获取注解的类,判断是否被注解 if(returnType.getDeclaringClass().isAnnotationPresent(IgnoreResponseAdvice.class)) {
return false;
}
if(returnType.getMethod().isAnnotationPresent(IgnoreResponseAdvice.class)) {
return false;
}
return true;
}
@Override
public Object beforeBodyWrite(Object body, MethodParameter returnType,
MediaType selectedContentType,
Class<? extends HttpMessageConverter<?>> selectedConverterType,
ServerHttpRequest request,
ServerHttpResponse response) {
// TODO Auto-generated method stub
CommonResponse<Object> commonResponse = new CommonResponse<>(0, "");
//body统一回应的内容
if(null==body) {
return commonResponse;
}else if (body instanceof CommonResponse ) {
commonResponse = (CommonResponse<Object>) body;
}else {
commonResponse.setDateT(body);
}
return commonResponse;
}
}
1.开发注解,给上面配置识别统一响应
/**
* 统一回应注解
* @author Administrator
*
*/
@Target({ElementType.TYPE,ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface IgnoreResponseAdvice {
}
二. 统一异常回应。
/**
* 统一回应异常
* @author Administrator
*
*/
@RestControllerAdvice(basePackages="com.hangzhou.controller")
public class GlobalExceptionAdvice {
@ExceptionHandler(value=AdException.class)//指明处理的异常类型
public CommonResponse<String> handlerAdException(HttpServletRequest req,AdException ex) {
CommonResponse<String> response= new CommonResponse(-1, "business error");
response.setDateT(ex.getMessage());
return response;
}
}
另外:可以进行异常分类定义多少handler方法,@Exceptionhandler不同的value进行分类。
package com.hangzhou.ad.exception;
/**
* 定义一个异常,说明我异常要处理的类
* @author Administrator
*
*/
public class AdException extends Exception{
public AdException(String message) {
super(message);
}
}
三.统一配置(消息转化器)
/**
*
*/
/**配置消息转换器
* @author Administrator
*
*/
package com.hangzhou.ad.conf;
import java.util.List;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
@Configuration
public class WebConfiguration implements WebMvcConfigurer{
@Override
public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
WebMvcConfigurer.super.configureMessageConverters(converters);
converters.clear();
//添加转化器,java对象转换Json对象
converters.add(new MappingJackson2HttpMessageConverter());
}
}