Spring MVC 3.2 @ResponseBody拦截器

use*_*337 11 spring spring-mvc

在我们的应用程序中,我们使用JSON进行请求和响应.控制器方法使用@RequestBody()进行注释.返回的对象,例如TransferResponse.我想从@ResponseBody获取此对象.我已经设置了拦截器postHandle方法:

@Override
    public void postHandle(HttpServletRequest request,
                           HttpServletResponse response,
                           Object handler,
                           ModelAndView modelAndView) throws java.lang.Exception

    {
....

}
Run Code Online (Sandbox Code Playgroud)

那么如何在这个postHandle方法中获取JSON呢?

在此先感谢GM

And*_*anu 6

正如Pavel Horal已经提到的,当postHandle()调用方法时,响应体对象已经转换为JSON并写入响应.您可以尝试编写自己的自定义注释和方面,以拦截控制器响应主体对象.

// custom annotation
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface MyCustomAnnotation {
}

// aspect
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.springframework.stereotype.Component;

@Aspect
@Component
public class MyCustomAnnotationAspect {
    @Around(value = "@annotation(org.package.MyCustomAnnotation)", argNames = "pjp")
    public Object aroundAdvice(final ProceedingJoinPoint pjp) {
        // this is your response body
        Object responseBody = pjp.proceed();
        return responseBody;
    }
}
Run Code Online (Sandbox Code Playgroud)

使用支持AspectJ方面 @EnableAspectJAutoProxy


Juk*_*kka 0

正如 Pavel 所说,您可能无法通过这种方式获取响应 JSON。我认为最好的选择是实现一个过滤器,在将响应写入客户端之前查看响应。查看OncePerRequestFilter作为起点。