Spring MVC"复制" URL的一部分

时间:2014-03-15 08:30:36

标签: java spring spring-mvc

我在@Controller环境中有一个简单的spring-mvc。这是控制器:

@Controller
public class MessageController {
    private static Logger LOG = LoggerFactory
            .getLogger(MessageController.class);

    @RequestMapping(value = "/messages/{userId}/{messageId}", method = RequestMethod.GET)
    public Message getMessage(@PathVariable("userId") String uid,
            @PathVariable("messageId") String msgid) {
        LOG.trace("GET /message/{}/{}", uid, msgid);
        return new Message();
    }
}

这是web.xml中的servlet映射:

<web-app xmlns="http://java.sun.com/xml/ns/j2ee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
             http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"
         version="2.4">

    <display-name>Messaging Service</display-name>

    <servlet>
        <servlet-name>messaging</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    </servlet>

    <servlet-mapping>
        <servlet-name>messaging</servlet-name>
        <url-pattern>/*</url-pattern>
    </servlet-mapping>

</web-app>

当我通过jetty启动应用程序并针对/messages/abc/def运行请求时,我会收到以下日志:

INFO: Mapped "{[/messages/{userId}/{messageId}],methods=[GET],params=[],headers=[],consumes=[],produces=[],custom=[]}" onto public ....Message ....MessageController.getMessage(java.lang.String,java.lang.String)
WARNING: No mapping found for HTTP request with URI [/messages/abc/messages/abc/def] in DispatcherServlet with name 'messaging'

我在这里做错了什么?该请求肯定只包含/messages/abc/def,为什么内部转换为/messages/abc/messages/abc/def

4 个答案:

答案 0 :(得分:18)

我猜这与默认视图名称解析有关。

如果希望处理程序方法返回的值被编码为响应主体(在JSON,XML等中),则需要使用@ResponseBody来声明方法,或者使用{{1来注释整个控制器(在Spring 4.x中)。

否则,Spring会尝试使用return作为模型属性呈现视图。由于您没有提供要呈现的视图的名称,因此Spring会尝试从请求URL中推断出它。

答案 1 :(得分:1)

除了@axtvat之外,要注意@Cotroller和@RestController之间的区别,@ RestController为我解决了这个问题。 https://dzone.com/articles/spring-framework-restcontroller-vs-controller

答案 2 :(得分:0)

您是否有一个名为messaging-servlet.xml的文件声明了Web应用程序上下文? 默认情况下,因为您已命名DispatcherServlet消息传递,Spring将尝试找到该文件。

答案 3 :(得分:0)

我遇到了同样的问题。

我通过将@Controller替换为@RestController来解决它。