使用RequestBodyAdvice、ResponseBodyAdvice优化程序请求与响应

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

ResponseBodyAdviceSpringMVC4.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接口

  • 重写supportsboforeBodyWrite

  • 实现类上添加注解标记: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)领取

  • 12
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值