Spring MVC“复制”URL的部分

roqulrg3  于 2023-06-21  发布在  Spring
关注(0)|答案(6)|浏览(148)

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

@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中的servletMap:

<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

hm2xizp9

hm2xizp91#

我猜这与默认视图名称解析有关。
如果你希望你的handler方法返回的值被编码为响应体(在JSON,XML等中),你需要用@ResponseBody注解方法,或者用@RestController注解整个控制器(在Spring 4.x中)。
否则,Spring会尝试使用return作为model属性来呈现视图。由于您没有提供要呈现的视图的名称,Spring尝试从请求URL推断它。

dddzy1tm

dddzy1tm2#

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

zf9nrax1

zf9nrax13#

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

cvxl0en2

cvxl0en24#

我也有同样的问题。
我通过将@Controller替换为@RestController来修复它。

pexxcrt2

pexxcrt25#

以上这些都没有解决我的问题。使用@RestController并没有重定向,只是在屏幕上打印了正确的url(没有重复的url)。我找到了另一个有效的解决办法。What is the difference between response.sendRedirect() and request.getRequestDispatcher().forward(request,response)

cbjzeqam

cbjzeqam6#

如果您的RequestMapping value碰巧引用属性[我承认OP没有]..

例如:

@RequestMapping(value = "${reference.to.an.application.properties.value}", method = RequestMethod.GET)

..然后确保考虑如何解析属性值;特别是如果决议中可能发生任何压倒性的情况。
classpath root application.properties例如:

reference.to.an.application.properties: /some/path/
reference.to.an.application.properties.value: ${reference.to.an.application.properties}/{ID}

如果reference.to.an.application.properties也在其他地方定义[另外],那就是覆盖属性文件中同名的属性键(因为Spring属性优先);在其他地方(在我的例子中,OpenShift properties [由OpenShift作为环境变量传递给Spring])例如:

reference.to.an.application.properties: /some/path/{ID}

然后(通过覆盖优先级)reference.to.an.application.properties.value将解析为/some/path/{ID}/{ID}(因此是重复的URL路径),而不是/some/path/{ID}

相关问题