给定一个URI,我如何查找哪个控制器方法将为该URL提供服务?

时间:2015-12-13 22:48:46

标签: java spring-mvc

如果我的URI为/customers/1234/salesOrders如果请求该端点,我如何查找将使用哪种@RequestMapping方法?

要明确的是,这些并非实际要求。我们的应用程序记录了所请求的每个URI,现在要求我们提供每个不同请求映射的使用报告(已删除变量)。

1 个答案:

答案 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}