柯桥增值式服务
25'ten fazla konu seçemezsiniz Konular bir harf veya rakamla başlamalı, kısa çizgiler ('-') içerebilir ve en fazla 35 karakter uzunluğunda olabilir.

60 satır
2.6KB

  1. package com.ningdatech.kqapi.common.handler;
  2. import com.ningdatech.kqapi.common.model.ApiResponse;
  3. import org.springframework.core.MethodParameter;
  4. import org.springframework.http.MediaType;
  5. import org.springframework.http.converter.HttpMessageConverter;
  6. import org.springframework.http.server.ServerHttpRequest;
  7. import org.springframework.http.server.ServerHttpResponse;
  8. import org.springframework.web.bind.annotation.ExceptionHandler;
  9. import org.springframework.web.bind.annotation.RestControllerAdvice;
  10. import org.springframework.web.servlet.mvc.method.annotation.ResponseBodyAdvice;
  11. /**
  12. * @Author liuxinxin
  13. * @Date 2021/7/21 11:26
  14. * @Version 1.0
  15. **/
  16. @RestControllerAdvice(basePackages = {
  17. "com.ningdatech.kqapi.zzsfw.controller",
  18. "com.ningdatech.kqapi.scheduler.controller"
  19. })
  20. public class GlobalResponseHandler implements ResponseBodyAdvice<Object> {
  21. private static final String SWAGGER_CLASS_PREFIX = "springfox.documentation";
  22. @Override
  23. public boolean supports(MethodParameter methodParameter, Class<? extends HttpMessageConverter<?>> aClass) {
  24. return filter(methodParameter);
  25. }
  26. @Override
  27. public Object beforeBodyWrite(Object o, MethodParameter methodParameter, MediaType mediaType,
  28. Class<? extends HttpMessageConverter<?>> aClass, ServerHttpRequest serverHttpRequest,
  29. ServerHttpResponse serverHttpResponse) {
  30. ApiResponse<Object> apiResponse = ApiResponse.ofSuccess(o);
  31. // 处理字符串时,遇到了类型转换的问题,debug一步一步跟踪,原来是对于字符串的ContentType是“text-plain”,
  32. // ConverterType是StringHttpMessageConverter这个类型转换,
  33. // 由于将结果封装成了自定义的ApiResponse类型,所以有ApiResponse转换成String报错
  34. // 所以需要对String类型的返回值单独进行处理
  35. // if (o instanceof String) {
  36. // return JSONUtil.toJsonStr(apiResponse);
  37. // }
  38. return ApiResponse.ofSuccess(o);
  39. // return o;
  40. }
  41. private Boolean filter(MethodParameter methodParameter) {
  42. Class<?> declaringClass = methodParameter.getDeclaringClass();
  43. // swagger中的所有返回不进行统一封装
  44. if (declaringClass.getName().contains(SWAGGER_CLASS_PREFIX)) {
  45. return false;
  46. }
  47. if (methodParameter.hasMethodAnnotation(ExceptionHandler.class)) {
  48. return false;
  49. }
  50. // 如果本身就是使用ApiResponse返回,则不需要进行格式化
  51. return !methodParameter.getParameterType().equals(ApiResponse.class);
  52. }
  53. }