我想构建一个库,它将在带注释的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为你提供帮助!
答案 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);
}