Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Spring引导相当于JAX-RS拦截器_Spring_Spring Boot_Jax Rs - Fatal编程技术网

Spring引导相当于JAX-RS拦截器

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)

在Jackson开始序列化JSON响应之前,我想将我的
@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