Type targetType, Class<? extends HttpMessageConverter<?>> converterType);
复制代码
body读取之后操作,一般直接返回原实例
Object handleEmptyBody(@Nullable Object body, HttpInputMessage inputMessage, MethodParameter parameter,
Type targetType, Class<? extends HttpMessageConverter<?>> converterType);
复制代码
当body问empty时操作
实现步骤
-
编写一个实现类实现
RequestBodyAdvice
接口 -
分别实现对应的方法
-
实现类上添加注解标记:
ControllerAdvice
实例
@ControllerAdvice
public class RequestInterceptor implements RequestBodyAdvice {
@Override
public boolean supports(MethodParameter methodParameter, Type type, Class<? extends HttpMessageConverter<?>> aClass) {
RequestAdvice requestAdvice = methodParameter.getMethodAnnotation(RequestAdvice.class);
if (requestAdvice == null) {
requestAdvice = methodParameter.getDeclaringClass().getAnnotation(RequestAdvice.class);
}
return requestAdvice != null;
}
@Override
public HttpInputMessage beforeBodyRead(HttpInputMessage httpInputMessage, MethodParameter methodParameter, Type type, Class<? extends HttpMessageConverter<?>> aClass) throws IOException {
String bodyStr = IOUtils.toString(httpInputMessage.getBody(), StandardCharsets.UTF_8);
return new HttpInputMessage() {
@Override
public InputStream getBody() throws IOException {
ApiRequest request = JsonUtils.json2Obj(bodyStr, new TypeReference<ApiRequest>() {
});
String body = bodyStr;
if (request != null && request.getData() != null) {
body = JsonUtils.obj2Json(request.getData());
}
return new ByteArrayInputStream(body.getBytes(StandardCharsets.UTF_8));
}
@Override
public HttpHeaders getHeaders() {
return httpInputMessage.getHeaders();
}
};
}
@Override
public Object afterBodyRead(Object body, HttpInputMessage httpInputMessage, MethodParameter methodParameter, Type type, Class<? extends HttpMessageConverter<?>> aClass) {
return body;
}
@Override
public Object handleEmptyBody(Object body, HttpInputMessage httpInputMessage, MethodParameter methodParameter, Type type, Class<? extends HttpMessageConverter<?>> aClass) {
return body;
}
复制代码
上面实例中,supports
添加了支持条件:当控制层方法或者类上有标记注解 @RequestAdvice
注解时,才会进入其他相关方法。当不需要任何限制时,supports
直接返回true
即可。
ResponseBodyAdvice
ResponseBodyAdvice
是SpringMVC
4.1提供的一个接口,它允许在 执行 @ResponseBody
后自定义返回数据,或者将返回@ResponseEntity
的 Controller Method
在写入主体前使用 HttpMessageConverter
进行自定义操作。由此可见,它的作用范围为:
-
使用
@ResponseBody
注解进行标记 -
返回
@ResponseEntity
提供的方法
boolean supports(MethodParameter returnType, Class<? extends HttpMessageConverter<?>> converterType);
复制代码
该方法返回true
时,才会进去下面的 beforeBodyWrite
方法。该方法可以添加一些判断条件,比如 方法上有 xxx 注解的才会生效等等。
T beforeBodyWrite(@Nullable T body, MethodParameter returnType, MediaType selectedContentType,
Class<? extends HttpMessageConverter<?>> selectedConverterType,
ServerHttpRequest request, ServerHttpResponse response);
复制代码
body写入前的操作。
实现步骤
-
编写一个实现类实现
ResponseBodyAdvice
接口 -
重写
supports
和boforeBodyWrite
-
实现类上添加注解标记:
ControllerAdvice
实例
@ControllerAdvice
public class ResponseInterceptor implements ResponseBodyAdvice {
@Override
public boolean supports(MethodParameter returnType, Class converterType) {
ResponseAdvice responseAdvice = returnType.getMethodAnnotation(ResponseAdvice.class);
if (responseAdvice == null) {
responseAdvice = returnType.getDeclaringClass().getAnnotation(ResponseAdvice.class);
}
return responseAdvice != null;
}
@Override
public Object beforeBodyWrite(Object body, MethodParameter returnType, MediaType selectedContentType, Class selectedConverterType, ServerHttpRequest request, ServerHttpResponse response) {
try {
ApiResult result = new ApiResult<>();
result.setCode(0);
result.setMsg(“success”);
result.setdData(body);
return result;
} catch (Exception e) {
e.printStackTrace();
}
return body;
}
}
复制代码
最后
无论是哪家公司,都很重视基础,大厂更加重视技术的深度和广度,面试是一个双向选择的过程,不要抱着畏惧的心态去面试,不利于自己的发挥。同时看中的应该不止薪资,还要看你是不是真的喜欢这家公司,是不是能真的得到锻炼。
针对以上面试技术点,我在这里也做一些分享,希望能更好的帮助到大家。
找小编(vip1024c)领取
加重视技术的深度和广度,面试是一个双向选择的过程,不要抱着畏惧的心态去面试,不利于自己的发挥。同时看中的应该不止薪资,还要看你是不是真的喜欢这家公司,是不是能真的得到锻炼。
针对以上面试技术点,我在这里也做一些分享,希望能更好的帮助到大家。
[外链图片转存中…(img-floKnsGK-1721725087207)]
[外链图片转存中…(img-HnlPh80f-1721725087208)]
[外链图片转存中…(img-xeE4NjLv-1721725087208)]
找小编(vip1024c)领取