vi设计 站酷/西安网站搭建
1.声明
当前的内容用于本人学习和复习使用
原因:
1.由于本人最近想要统一返回响应json数据,但是如果随便乱写就会导致数据的不确定性(必须要有良好的组织)
2.各种返回类型,以及数据的返回形式不同,可能导致调用一个接口产生不同的响应
(不利于后期维护)
本人按照以下几点来实现后台向前台返回的json格式
==1.json格式中必须带有:响应时间,访问的url,结果类型,响应码,消息(可以是错误信息也可以是成功的消息),数据(查询的时候返回的数据)=
=
2.统一返回json数据可以使用的方法有:规定所有返回类型为指定类型,后期对返回值的处理,通过切面方式转换为指定类型
2.规范返回的类型
实现方式可以定义一个默认的返回的类DefaultResponseBody
@Data
@NoArgsConstructor
@AllArgsConstructor
public class DefaultResponseBody {private String url;private String resultType;// 默认为成功,successprivate Integer responseStatusCode; // 状态码为200或者其他private Date responseTime;private String message;private Object data;// 存放的数据
}
首先这个方式最简单,但是要求所有人必须统一使用这种风格(如果是团队操作,建议使用该方式)
3.通过切面方式统一处理返回值(不建议)
至于为什么不建议,因为Controller中的方法中的返回值并不确定,但是并不一定是指定的类型,我们对于指定类型需要特定的解析(浪费很多时间),多一个类型就会多一个解析方式
@Configuration
@Aspect
public class PagedAspectConfig {// @Pointcut("execution (* com.hy.commons.systemmodel.controller.*.*(..)) &&@Pointcut("@annotation(" + 需要拦截的注解+ ")")void pagePointCut() {}@AutowiredServletRequest request;@Around("pagePointCut()")Object handlerBeforePaged(ProceedingJoinPoint pointcut) throws Throwable {//1.方法的执行并获得返回值//2.通过执行转换参数并直接通过响应直接返回}
我们需要通过类型判断实现特定的处理
4.通过后续处理(通过实现ResponseBodyAdvice方式处理,不建议)
弊端:返回值为Object,但是一个方法是具有返回类型的
,并且,当前如果使用包装的方式包装返回值就会导致(类型转换错误!)
,对于扩展不利,因为每一个方法中返回类型不一致(可以通过约定指定返回值然后处理,感觉有点复杂)
@ControllerAdvice
public class ControllerResponseBodyAdvice implements ResponseBodyAdvice<Object> {@Overridepublic boolean supports(MethodParameter returnType, Class<? extends HttpMessageConverter<?>> converterType) {return true; // 判断该返回类型是否支持解析,这里可以写我们需要的类型}@Overridepublic Object beforeBodyWrite(Object body, MethodParameter returnType, MediaType selectedContentType,Class<? extends HttpMessageConverter<?>> selectedConverterType, ServerHttpRequest request,ServerHttpResponse response) {// 这里可以包装然后返回,按照指定类型返回,需要类型判断和类型转换return body;}
}
由于不同的类型需要适配到指定的类型,所以必然是复杂的,并且困难!
5.总结
1.通过今天的统一返回值方式发现了许多方法,但是最终最好的就是让所有的人使用统一的返回值例如:DefaultResponseBody类型(或者接口)
2.理解了为什么Spring中的约定优于配置的原理,因为没有一个统一的约定,写起来就很复杂
,各种不同的类型导致不同的结果,最终导致系统的复杂性
以上纯属个人见解,如有问题请联系本人!