如何更改Spring MVC处理url'dot'字符的行为

时间:2010-11-09 15:25:41

标签: java spring-mvc

我正在尝试将一个Web项目从Jersey迁移到Spring MVC 3.0。这个过程非常简单,直到我开始使用点符号迁移应该处理URL的控制器:“/ myApp / resources / create / root.subFolder1 ”。 Spring MVC似乎无耻地从URL中删除了“。subFolder1”部分,它发生在框架代码的深处(参见 AbstractUrlHandlerMapping 类)

uriTemplateVariables.putAll(getPathMatcher().extractUriTemplateVariables(matchingPattern, urlPath));

所以我的控制器方法是用 root 路径参数调用的,而不是 root.subFolder1

我真的想找到一种方法来自定义此行为。有什么建议吗?

PS。该要求有点保持现有的URL结构,即切换到查询参数“/ myApp / resources / create / ?path = root.subFolder1 ”等变通方法。我无法考虑。

PS。我的Spring配置看起来像

<mvc:annotation-driven/>

<bean class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping">
    <property name="useDefaultSuffixPattern" value="false" />
</bean>

<context:component-scan base-package="my.app.pkg"/>

6 个答案:

答案 0 :(得分:8)

试试这个:

<bean
        class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping">
        <property name="useDefaultSuffixPattern" value="false" />
    </bean>

这应该使Spring不会尝试解析扩展。

另请参阅:Spring MVC @PathVariable getting truncated

并且:Spring Documentation

潜在的配置文件:

web.xml(我设置servlet的东西)

<servlet>
    <servlet-name>Spring MVC Dispatcher Servlet</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet
    </servlet-class>
    <init-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>
            /WEB-INF/spring/*.xml,classpath*:applicationContext.xml,classpath*:restApplicationContext.xml
        </param-value>
    </init-param>
    <load-on-startup>2</load-on-startup>
</servlet>

然后在WEB / INF / spring / mvc-config.xml中我有这样的东西:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:mvc="http://www.springframework.org/schema/mvc"
    xsi:schemaLocation="
        http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
        http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd">

    <bean
        class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping">
        <property name="useDefaultSuffixPattern" value="false" />
    </bean>
</beans>

答案 1 :(得分:8)

在某些情况下可能更容易的另一种可能性是在URL的末尾添加一个尾随/

因此,您的网址为/myApp/resources/create/root.subFolder1/

这可以在我的应用程序中使用Spring MVC 3.1。

答案 2 :(得分:2)

为了

<bean class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping" />
<bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter" />

要工作,你必须删除/注释掉

<mvc:annotation-driven />
<mvc:default-servlet-handler />

和任何其他mvc:配置定义为覆盖自定义bean声明。

答案 3 :(得分:1)

这是一个婊子。我们团队中的一个人在周末开始工作。我们打算用下划线但他得到了它。他从控制器类属性中删除了@Controller,并为该类留下了@RequestMapping空白。在Http get和put的公共方法上,他将“/2.0/”添加到@RequestMapping。示例如下。

@RequestMapping
public class EndpointController {

@RequestMapping(value="/2.0/endpoint", method = RequestMethod.POST,
consumes=MediaType.APPLICATION_JSON_VALUE, produces=MediaType.APPLICATION_JSON_VALUE)
public ResponseEntity<EndpointView> create( @Valid @RequestBody EndpointView endpointParams, HttpServletRequest request )
祝大家好运。这个问题太糟糕了。

答案 4 :(得分:1)

我和Robert Beltran几乎一样,但我留下了@Controller注释。重要的是放&#34; /1.0 /"到方法的@RequestMapping,而不是类注释 我的例子:

@Controller
@RequestMapping("")
public class ClientApi {

private final String API_PREFIX = "/api/1.0/client";

@RequestMapping(value = API_PREFIX + "/{clientId}", method = RequestMethod.GET)
@ResponseBody
public ClientDetailsImpl get(@PathVariable String clientId) {
    // my code
}
}

答案 5 :(得分:0)

上面的答案应该是正确的,但一定要从XML配置中删除<mvc:annotation-driven/>,否则bean定义会被注释驱动标记的一部分推翻。

请参阅java docssource code,了解删除此便捷标记后您错过的所有配置。