在带注释的Spring Controller上获取请求和响应的json内容

时间:2016-06-15 13:19:20

标签: json spring annotations request aop

我想构建一个库,它将在带注释的Spring控制器上保存请求和响应的Json内容。

所以我构建了自己的注释@Foo并将其放在一些控制器上:

    @Foo
    @RequestMapping(method = RequestMethod.POST, value = "/doSomeThing", produces = {
            MediaType.APPLICATION_JSON_VALUE, MediaType.TEXT_XML_VALUE,
            MediaType.APPLICATION_XML_VALUE})
    public ResponseEntity<T> doSomething(/*some parameters*/) {
        T t = doSomeJob(T.class);
        return new ResponseEntity<T>(t, HttpStatus.OK);
}

我无法保证请求和响应符合Contrellor的参数! 而且我正在接受任何在@AfterReturning AOP切入点中具有该注释的Controller的调用。

@Component
@Aspect
public class XYInterceptor
@AfterReturning(
            pointcut = "execution(@my.annotation.Foo)")
            public void doSomethingWithJsonContent(JoinPoint joinPoint) throws Throwable {

            //How can i get json value of request and response here?    
}   

如何获取在json格式化的请求和响应内容(例如它是发送/返回给客户端)?

Thanx为你提供帮助!

1 个答案:

答案 0 :(得分:0)

嗯,您需要通过注入的类成员,方法参数或方法返回值以某种方式从控制器方法访问请求和响应。它必须 某处 。因为你没有解释你打算从哪里得到它,我可以发布一个通用答案,显示如何确定方法参数并从@AfterReturning建议中返回值。如果您使用更详细的信息更新问题,我也可以相应地更新答案。

我的切入点(已注释掉的一个也可以,选择你最喜欢的一个)将返回值绑定到一个参数,并假设请求和响应都是String类型。随意替换你最喜欢的。此外,如果您知道参数存在并且还知道其(超级)类型,则可以将截取的方法中的参数(无论它在签名中的哪个位置)绑定到类型化的通知方法参数。通过这种方式,您可以摆脱getArgs()上缓慢而丑陋的循环。

//@AfterReturning(pointcut = "execution(@my.annotation.Foo * *(..))", returning = "response")
@AfterReturning(pointcut = "@annotation(my.annotation.Foo)", returning = "response")
public void interceptRequest(String response, JoinPoint thisJoinPoint) {
    System.out.println(thisJoinPoint);
    for (Object arg : thisJoinPoint.getArgs()) {
        if (arg instanceof String)
            System.out.println("  request = " + arg);
    }
    System.out.println("  response = " + response);
}