如果我的URI为/customers/1234/salesOrders
如果请求该端点,我如何查找将使用哪种@RequestMapping
方法?
要明确的是,这些并非实际要求。我们的应用程序记录了所请求的每个URI,现在要求我们提供每个不同请求映射的使用报告(已删除变量)。
答案 0 :(得分:0)
好的,想出这个。如果将RequestMappingHandlerMapping
注入控制器,则可以将其与MockHttpServletRequest
一起使用,然后查询将使用哪种处理程序方法。
// Create a mock request with method and URI.
MockHttpServletRequest req = new MockHttpServletRequest("GET", "/test/abc/000");
// Add request params and other requriements to request object.
// handlerMapping is injected using @Autowired into the class.
HandlerExecutionChain handler = this.handlerMapping.getHandler(req);
String path;
if (handler == null) {
path = null;
} else {
path = "";
// I'm not sure what other types there could be, a test may be
// required though I'm omitting it.
HandlerMethod handlerMethod = (HandlerMethod) handler.getHandler();
Method method = handlerMethod.getMethod();
RequestMapping reqMapping;
// If the class has a path mapping, we must also include it.
if (method.getDeclaringClass().isAnnotationPresent(RequestMapping.class)) {
reqMapping = method.getDeclaringClass().getAnnotation(RequestMapping.class);
if (reqMapping.value() != null && reqMapping.value().length > 0) {
path += reqMapping.value()[0];
}
}
reqMapping = method.getAnnotation(RequestMapping.class);
if (reqMapping.value() != null && reqMapping.value().length > 0) {
path += reqMapping.value()[0];
}
}
// `path' now represents the URI with variable placeholders unexpanded.
这种方法足以让我得到我想要的东西。就我而言,我只想总结一下正在使用哪些端点。您还需要向请求添加任何内容类型限制,参数,标题等,以便解析正确的端点。
如果你的应用程序很简单,没有请求参数限制或没有使用标题,那么就没有必要添加它们。
在我的测试用例中,我只使用了以下控制器:
@Controller
@RequestMapping(value ={"/test/", "/test2/" })
public class Controller123 {
@RequestMapping(value = "abc/{x}")
public String test(@PathVariable("x") String x) {
return "test";
}
测试时返回/test/abc/{x}
。