优美的统一返回结果处理

我们写项目一般都会自己写一个Result对象,然后去处理,但是有一个问题,逐渐的接口写多了之后

image-20220920205449418

会发现每次都要写这个被Result包裹会很麻烦,这时候我们就可以考虑将他抽取出来,使用一个Handler去处理

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
package com.zang.blogz.result;

import io.github.vampireachao.stream.core.optional.Op;
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;

/**
* @author ZVerify
*/
@RestControllerAdvice(basePackages = "com.zang.blogz.controller")
public class AnimeResultHandler implements ResponseBodyAdvice<Object> {
/**
* Whether this component supports the given controller method return type
* and the selected {@code HttpMessageConverter} type.
*
* @param returnType the return type
* @param converterType the selected converter type
* @return {@code true} if {@link #beforeBodyWrite} should be invoked;
* {@code false} otherwise
*/
@Override
public boolean supports(MethodParameter returnType, Class<? extends HttpMessageConverter<?>> converterType) {
return !(returnType.getParameterType().isAssignableFrom(Result.class));
}

/**
* Invoked after an {@code HttpMessageConverter} is selected and just before
* its write method is invoked.
*
* @param body the body to be written
* @param returnType the return type of the controller method
* @param selectedContentType the content type selected through content negotiation
* @param selectedConverterType the converter type selected to write to the response
* @param request the current request
* @param response the current response
* @return the body that was passed in or a modified (possibly new) instance
*/
@Override
public Object beforeBodyWrite(Object body, MethodParameter returnType, MediaType selectedContentType, Class<? extends HttpMessageConverter<?>> selectedConverterType, ServerHttpRequest request, ServerHttpResponse response) {
return Op.of(body).map(Result::ok).orElseGet(Result::ok);
}
}

这样只需要在controller层返回要返回的对象就好了,如果想要返回error可以抛出异常然后全局异常处理