我们使用spring boot并通过实现MVCEndpoint实现了额外的Actuator端点。我们还将AOP应用于@RequestMapping方法以监控响应时间。
我有这两个班级:
include
和
public class ControllerStub {
@RequestMapping("/controller")
public String method(String arg) {
return "ok";
}
}
以下方面:
public class MyMvcEndpoint implements MvcEndpoint, Endpoint {
@Override
public String getPath() {
return "path";
}
@Override
public boolean isSensitive() {
return true;
}
@Override
public Class<? extends org.springframework.boot.actuate.endpoint.Endpoint> getEndpointType() {
return null;
}
@RequestMapping("/mvcEndpoint")
public String method(){
return "ok";
}
}
除了MvcEndpoint中的所有@RequestMapping方法之外,它还包含所有@RequestMapping方法,并且它没有像我期望的那样工作。它确实过滤掉了MVCEndpoint。但它并没有将ControllerStub包装在代理中。
我开始调试,我能够将其追溯到RuntimeTestWalker和ShadowMatch。看起来这个否定确实是使用aspectJ合成的,而不是包含aspectJ InstanceOf表达式。在ShadowMatch中,residualTest是
@Around("@annotation(requestMapping) && !target(org.springframework.boot.actuate.endpoint.mvc.MvcEndpoint)")
public Object process(ProceedingJoinPoint joinPoint, RequestMapping requestMapping) throws Throwable {
return timeExecution(joinPoint);
}
但是,我不知道否定的适用范围。在我看来,当instanceof检查失败而没有被否定时,结果返回false。
我在TestVisitorAdapter上访问了访问Not表达式的方法:
!((Var org.waterford.core.webapp.integrationtests.ControllerStub) instanceof org.springframework.boot.actuate.endpoint.mvc.MvcEndpoint)
我不了解所有的AspectJ机制,但我希望在RuntimeTestWalker.visit(Not e)的实现中,它必须在测试正文后否定结果。我的身体就是检查的实例。
我使用的是spring-boot 1.2.5.RELEASE和AspectJ Weaver 1.8.7。看起来像RuntimeTestWalker来自spring-aop-4.2.1.RELEASE对我来说。