为什么找不到处理程序方法?

时间:2015-08-02 15:50:52

标签: java rest servlets

我希望使用org.springframework.web.bind.annotation.RestController在我的GWT WebApplication之外公开一个简单的REST API。因此,我在 web.xml 中添加了另一个servlet,并将其映射到/app/restapi/*

<!-- ... -->
<servlet>
    <servlet-name>xsrf</servlet-name>
    <servlet-class>com.google.gwt.user.server.rpc.XsrfTokenServiceServlet</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>xsrf</servlet-name>
    <url-pattern>/app/xsrf</url-pattern>
</servlet-mapping>

<!-- New servlet for my REST API -->
<servlet>
    <servlet-name>mobile-dispatcher</servlet-name>
    <servlet-class>
        org.springframework.web.servlet.DispatcherServlet
    </servlet-class>
    <load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
    <servlet-name>mobile-dispatcher</servlet-name>
    <url-pattern>/app/restapi/*</url-pattern>
</servlet-mapping>

这是应该处理请求的控制器:

@RestController
@RequestMapping("/app/restapi")
public class RestaurantController {

    class ReturnValue {
        public String str = "1337";
    }

    @ResponseStatus(HttpStatus.OK)
    @RequestMapping(value = "/test", method = RequestMethod.GET, produces = { "application/json" })
    public ReturnValue getTest() {
        return new ReturnValue();
    }
}

问题是请求http://localhost:8080/app/restapi/test只给我:

16:14:22.497 [http-bio-8080-exec-8] DEBUG o.s.web.servlet.DispatcherServlet - DispatcherServlet with name 'mobile-dispatcher' processing GET request for [/app/restapi/test]
16:14:22.497 [http-bio-8080-exec-8] DEBUG o.s.w.s.m.m.a.RequestMappingHandlerMapping - Looking up handler method for path /test
16:14:22.497 [http-bio-8080-exec-8] DEBUG o.s.w.s.m.m.a.RequestMappingHandlerMapping - Did not find handler method for [/test]
16:14:22.497 [http-bio-8080-exec-8] WARN  o.s.web.servlet.PageNotFound - No mapping found for HTTP request with URI [/app/restapi/test] in DispatcherServlet with name 'mobile-dispatcher'
16:14:22.497 [http-bio-8080-exec-8] DEBUG o.s.web.servlet.DispatcherServlet - Successfully completed request

我不知道为什么。那么:我在这里做错了什么,我怎样才能按预期工作呢?

1 个答案:

答案 0 :(得分:1)

您像这样配置了servlet映射

<servlet-mapping> <servlet-name>mobile-dispatcher</servlet-name> <url-pattern>/app/restapi/*</url-pattern> </servlet-mapping>

这是您的应用程序的根网址。使用RequestMapping("/app/restapi")配置RestController时,这意味着控制器将侦听http://domain/app/restapi/app/restapi。 只需从您的控制器定义中删除("/app/restapi"),您就可以了。

在启动时,Spring MVC框架应该打印它监听到控制台的URL映射,你应该看到控制器的映射。