Spring引导相当于JAX-RS拦截器
在Jackson开始序列化JSON响应之前,我想将我的Spring引导相当于JAX-RS拦截器,spring,spring-boot,jax-rs,Spring,Spring Boot,Jax Rs,在Jackson开始序列化JSON响应之前,我想将我的@RestController方法的响应包装到不同的对象结构中。假设我使用下面的Spring控制器 @RestController @RequestMapping("/api/susu") public class SusuController { @RequestMapping(path = "/{id}", method = RequestMethod.GET) public Susu hello(String id)
@RestController
方法的响应包装到不同的对象结构中。假设我使用下面的Spring控制器
@RestController
@RequestMapping("/api/susu")
public class SusuController {
@RequestMapping(path = "/{id}", method = RequestMethod.GET)
public Susu hello(String id) {
Susu susu = new Susu();
susu.setDate(LocalDate.now());
susu.setName("Peter Pan");
return susu;
}
}
在JEE7中,我使用JAX-RS拦截器获取对SUSUSU
实例的访问权并包装它
@Provider
@Priority(1)
public class JsonStructureInterceptor implements WriterInterceptor {
private final JsonResponseBuilder jsonResponseBuilder = new JsonResponseBuilder();
@Override
public void aroundWriteTo(WriterInterceptorContext context) throws IOException, WebApplicationException {
Susu s = (Susu) context.getEntity(); // read the JAX-RS response entity
JsonObject jsonObjectWithStructure = jsonResponseBuilder.toResponse(s); // wrap it
// add it back into the JAX-RS context
context.setEntity(jsonObjectWithStructure);
context.proceed();
}
}
使用SpringBoot时,在不使用JAX-RS特性的情况下,实现等效功能的首选方法是什么
更新1:使用HandlerInterceptorAdapter
我在应用程序上下文中添加了以下HandlerInterceptorAdapter
,并调用了postHandle
方法。到目前为止,一切正常,但我不知道如何获得sususu
实例,以及如何将包装好的实例传递给进一步的处理
@Component
public class SusuHandlerInterceptor extends HandlerInterceptorAdapter {
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
Susu s = ; // how to get access to my Susu instance?
Wrapper w = new Wrapper(s);
// how to pass Wrapper instance on?
}
}
更新2:实施
响应建议
我找到了另一种方法,允许我访问控制器操作的返回值。这里的问题是我无法更改返回值的类型。似乎不可能在包装器
实例中包装sususu
实例
@ControllerAdvice
public class JsonFilter implements ResponseBodyAdvice<SusuController.Susu> {
@Override
public boolean supports(MethodParameter returnType, Class<? extends HttpMessageConverter<?>> converterType) {
return true;
}
@Override
public SusuController.Susu beforeBodyWrite(SusuController.Susu body, MethodParameter returnType, MediaType selectedContentType, Class<? extends HttpMessageConverter<?>> selectedConverterType, ServerHttpRequest request, ServerHttpResponse response) {
return body;
}
}
@ControllerAdvice
公共类JsonFilter实现ResponseBodyAdvice{
@凌驾
公共布尔支持(MethodParameter returnType,Class>converterType){
返回true;
}
@凌驾
公共SusuController.Susu BEFORE BODYWRITE(SusuController.Susu body、方法参数returnType、MediaType selectedContentType、Class>selectedConverterType、ServerHttpRequest请求、ServerHttpResponse响应){
返回体;
}
}
实现a允许您在对象转换之前对其进行修改
如果应修改返回类型,则必须省略泛型类型:
@ControllerAdvice
class JsonModifyingAdvice implements ResponseBodyAdvice {
@Override
public boolean supports(MethodParameter returnType, Class converterType) {
return true;
}
@Override
public Object beforeBodyWrite(Object body, MethodParameter returnType, MediaType selectedContentType,
Class selectedConverterType, ServerHttpRequest request, ServerHttpResponse response) {
return new WrappedResponse(body);
}
}
你可能正在找一个新的工作。谢谢。看起来很有希望,但我不知道如何使用API我想我正在寻找ResponseBodyAdvice
,但我仍然不确定如果您删除类型,如何使其工作ResponseBodyAdvice
。