Как изменить поведение Spring MVC при обработке URL-адреса 'точка' - PullRequest
8 голосов
/ 09 ноября 2010

Я пытаюсь перенести веб-проект с Джерси на Spring MVC 3.0.Процесс был действительно простым до того момента, когда я начал мигрировать контроллеры, которые должны обрабатывать URL с точечными обозначениями: "/myApp/resources/create/root.subFolder1".Spring MVC, похоже, бесстыдно вырезает часть ". SubFolder1" из URL, что происходит глубоко внутри кода платформы (см. AbstractUrlHandlerMapping class)

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

ИтакМетод контроллера вызывается с корневым параметром пути, а не root.subFolder1

Я бы очень хотел найти способ настроить это поведение.Любые советы?

PS.Требование заключается в том, чтобы сохранить существующую структуру URL, то есть обходные пути, такие как переключение на параметры запроса "/myApp/resources/create/?path=root.subFolder1" Я не могу рассмотреть.,Мой весенний конфиг выглядит как

<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 ]

8 голосов
/ 07 декабря 2012

Другая возможность, которая может быть легче в некоторых обстоятельствах, заключается в добавлении конечного / в конец URL.

Таким образом, ваш URL будет /myApp/resources/create/root.subFolder1/

Это работает вмое приложение с использованием Spring MVC 3.1.

8 голосов
/ 09 ноября 2010

Попробуйте это:

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

Это должно сделать так, чтобы Spring не пытался анализировать расширения.

См. Также: Spring MVC @PathVariable становится усеченным

А: Пружинная документация

Потенциальные конфигурационные файлы:

web.xml (где я устанавливаю сервлет)

<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>
2 голосов
/ 21 июня 2012

Чтобы

<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-компонентов.

1 голос
/ 11 февраля 2014

Я сделал почти то же самое, что и Роберт Белтран, но я оставил аннотацию @Controller для класса.Важно поместить /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
}
}
1 голос
/ 16 января 2013

Это была сука.Парень из нашей команды заставил его работать на выходных.Мы собирались пойти с подчеркиванием, но он получил это.Он удалил @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 )

Удачи всем.Эта проблема отстой.

0 голосов
/ 30 сентября 2011

Приведенный выше ответ должен быть корректным, но обязательно удалите <mvc:annotation-driven/> из конфигурации XML, в противном случае определение компонента переопределяется одной частью тега, управляемого аннотациями.

См. java docs и исходный код для всех настроек, которые вы пропустили при удалении этого вспомогательного тега.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...