Как изменить поведение Spring MVC при обработке символа "точка"
Я пытаюсь перенести веб-проект с Джерси на Spring MVC 3.0. Процесс был очень прост до того момента, когда я начал мигрировать контроллеры, которые должны обрабатывать URL с точечными нотами: "/myApp/resources/create/ root.subFolder1". Spring MVC, по-видимому, бесстыдно вырезает часть ". subFolder1" из URL-адреса, которая происходит глубоко внутри кода рамки (см. класс 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"/>
Ответы
Ответ 1
Попробуйте следующее:
<bean
class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping">
<property name="useDefaultSuffixPattern" value="false" />
</bean>
Это должно сделать так, чтобы Spring не попытался разобрать расширения.
Смотрите также: Spring MVC @PathVariable получает усеченный
И: Spring Документация
Потенциальные файлы конфигурации:
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
Другая возможность, которая может быть проще в некоторых случаях, - добавить конец /
в конец URL-адреса.
Таким образом, ваш URL будет /myApp/resources/create/root.subFolder1/
Это работает в моем приложении, используя Spring MVC 3.1.
Ответ 3
Для
<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.
Ответ 4
Это была сука. Парень в нашей команде заставил его работать в выходные. Мы собирались пойти с подчеркиванием, но он это получил. Он удалил @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 )
Удачи всем. Эта проблема сосала.
Ответ 5
Я сделал почти то же самое, что и Роберт Бельтран, но я оставил аннотацию @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
}
}
Ответ 6
Вышеуказанный ответ должен быть исправлен, но обязательно удалите <mvc:annotation-driven/>
из вашей XML-конфигурации, иначе определение bean будет отменено одной частью тега, зависящего от аннотаций.
Смотрите java docs и исходный код для вся конфигурация, которую вы пропустите, когда этот удобный тег удален.