SpringBoot之统一返回的json格式数据的意见

1.声明

当前的内容用于本人学习和复习使用

原因:

1.由于本人最近想要统一返回响应json数据,但是如果随便乱写就会导致数据的不确定性(必须要有良好的组织)

2.各种返回类型,以及数据的返回形式不同,可能导致调用一个接口产生不同的响应(不利于后期维护)

本人按照以下几点来实现后台向前台返回的json格式

==1.json格式中必须带有:响应时间,访问的url,结果类型,响应码,消息(可以是错误信息也可以是成功的消息),数据(查询的时候返回的数据)==

2.统一返回json数据可以使用的方法有:规定所有返回类型为指定类型,后期对返回值的处理,通过切面方式转换为指定类型

2.规范返回的类型

实现方式可以定义一个默认的返回的类DefaultResponseBody

@Data
@NoArgsConstructor
@AllArgsConstructor
public class DefaultResponseBody {
	private String url;
	private String resultType;// 默认为成功,success
	private 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() {
	}

	@Autowired
	ServletRequest request;
	
	@Around("pagePointCut()")
	Object handlerBeforePaged(ProceedingJoinPoint pointcut) throws Throwable {
		//1.方法的执行并获得返回值
		//2.通过执行转换参数并直接通过响应直接返回
	}

我们需要通过类型判断实现特定的处理

4.通过后续处理(通过实现ResponseBodyAdvice方式处理,不建议)

弊端:返回值为Object,但是一个方法是具有返回类型的,并且,当前如果使用包装的方式包装返回值就会导致(类型转换错误!),对于扩展不利,因为每一个方法中返回类型不一致(可以通过约定指定返回值然后处理,感觉有点复杂)

@ControllerAdvice
public class ControllerResponseBodyAdvice implements ResponseBodyAdvice<Object> {
	@Override
	public boolean supports(MethodParameter returnType, Class<? extends HttpMessageConverter<?>> converterType) {
		
		return true; // 判断该返回类型是否支持解析,这里可以写我们需要的类型
	}

	@Override
	public Object beforeBodyWrite(Object body, MethodParameter returnType, MediaType selectedContentType,
			Class<? extends HttpMessageConverter<?>> selectedConverterType, ServerHttpRequest request,
			ServerHttpResponse response) {
		// 这里可以包装然后返回,按照指定类型返回,需要类型判断和类型转换
		return body;

	}
}

由于不同的类型需要适配到指定的类型,所以必然是复杂的,并且困难!

5.总结

1.通过今天的统一返回值方式发现了许多方法,但是最终最好的就是让所有的人使用统一的返回值例如:DefaultResponseBody类型(或者接口)

2.理解了为什么Spring中的约定优于配置的原理,因为没有一个统一的约定,写起来就很复杂,各种不同的类型导致不同的结果,最终导致系统的复杂性

以上纯属个人见解,如有问题请联系本人!

你可能感兴趣的:(SpringBoot)