java response通用返回
编程语言
• Java
• 611次浏览
• 0次点赞
• 2019-04-25 12:42
场景
后台 接口统一返回 code、message、data
responseEntity
import com.maox.common.enums.ResponseEnums;
import lombok.Data;
/**
* ResponseEntity
*
* @author maoxian
* @since 2019-04-24 14:09
*/
@Data
public class ResponseEntity {
private String code;
private String msg;
private Object data;
private ResponseEntity(Object data) {
this.code = ResponseEnums.SUCCESS_OPTION.getCode();
this.msg = ResponseEnums.SUCCESS_OPTION.getMsg();
this.data = data;
}
private ResponseEntity(ResponseEnums responseEnums) {
this.code = responseEnums.getCode();
this.msg = responseEnums.getMsg();
}
private ResponseEntity(String code, String msg) {
this.code = code;
this.msg = msg;
}
public static ResponseEntity SUCCESS(Object data) {
return new ResponseEntity(data);
}
public static ResponseEntity ERROR(ResponseEnums responseEnums) {
return new ResponseEntity(responseEnums);
}
public static ResponseEntity ERROR(String code, String msg) {
return new ResponseEntity(code, msg);
}
}
方法调用
@GetMapping
@ApiOperation(value = "常用网站列表", notes = "常用网站列表")
public ResponseEntity list() {
return ResponseEntity.SUCCESS(this.tmWebsiteService.list(TmWebsiteVO.class));
}
ResponseEntity 为返回的 对象 这样的问题就是 每个方法都要写 ResponseEntity 如果有漏写则无法统一
解决办法
增加统一处理类 GlobalResponseHandle
import com.maox.common.ResponseEntity;
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.stereotype.Controller;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.bind.annotation.RestControllerAdvice;
import org.springframework.web.servlet.mvc.method.annotation.ResponseBodyAdvice;
/**
* 统一处理handle
*
* @author maoxian
* @since 2019-04-24 15:12
*/
@RestControllerAdvice(annotations = {RestController.class, Controller.class})
public class GlobalResponseHandle implements ResponseBodyAdvice {
private final String responsePath = "com.maox.common.ResponseEntity";
private final String responseEntity = "org.springframework.http.ResponseEntity";
private final String voidPath = "void";
@Override
public boolean supports(MethodParameter methodParameter,
Class extends HttpMessageConverter>> aClass) {
// 如果地址 不是responsePath和responseEntity则需要走拦截
return !responsePath.equals(methodParameter.getParameterType().getName()) &&
!responseEntity.equals(methodParameter.getParameterType().getName());
}
@Override
public Object beforeBodyWrite(Object o, MethodParameter methodParameter, MediaType mediaType,
Class extends HttpMessageConverter>> aClass, ServerHttpRequest serverHttpRequest,
ServerHttpResponse serverHttpResponse) {
final String methodParameterName = methodParameter.getParameterType().getName();
// 根据各种情景返回结果集
if (voidPath.equals(methodParameterName)) {
return ResponseEntity.SUCCESS(null);
}
if (!mediaType.includes(MediaType.APPLICATION_JSON)) {
return o;
}
if (responsePath.equals(methodParameterName)) {
return o;
}
// 用ResponseEntity.SUCCESS包含返回结果
return ResponseEntity.SUCCESS(o);
}
}
应用
修改 第一个 的 list 方法
@GetMapping
@ApiOperation(value = "常用网站列表", notes = "常用网站列表")
public List list() {
return this.tmWebsiteService.list(TmWebsiteVO.class);
}
返回结构一致 修改成功 这样 就不需要强制写 responseEntity 并且吧所有的返回都包在了 返回体了
再也不用担心熊孩子瞎传值了