Запрос на получение работает только с завершающей косой чертой (аннотации Spring REST)

У меня есть контроллер Spring REST:

@RestController
@RequestMapping(value = "/myresource")
public class MyResourceController {
  ...
}

С помощью метода запроса GET:

@RequestMapping(method = GET, value = "/{value1}/{value2}/{value3}", produces = MediaType.APPLICATION_JSON_VALUE + ";charset=UTF-8")    
public ResponseEntity<MyResponseType> getMyResource(
  @ApiParam(value = "...",...)
  @PathVariable("value1") String value1,
  @ApiParam(value = "...",...)
  @PathVariable("value2") String value2,
  @ApiParam(value = "...",...)
  @PathVariable("value3") String value3) {
//...
}

Я ожидал, что этот метод можно будет вызвать с помощью:

http://myserver:8080/myresource/value1/value2/value3

Но до него можно добраться только с помощью косой черты в конце:

http://myserver:8080/myresource/value1/value2/value3/

Почему это так или что вызывает это?

Swagger предполагает, что нет завершающих слэшей, и я не могу сейчас отправить запрос с swagger.

Что я могу сделать, чтобы работал только первый URL, но не второй?

Заранее большое спасибо за ваши комментарии и ответы.


Отредактировано 2:

Я обнаружил, что без косой черты информация о value3 будет неполной. value3 должен быть адресом электронной почты, но все, начиная с последней точки, обрезается. Поэтому вместо «[email protected]» я получаю «myemail @ something».

Это объясняет, почему я не могу получить правильный результат (нет содержимого и код состояния HTTP 404). Но до сих пор не понимаю, почему это происходит. Более того, если у меня есть адрес электронной почты с тремя буквами в домене верхнего уровня (например, .com), запрос никогда не достигает метода GET "getMyResource" ....


Отредактировано 1: Мой web.xml выглядит так:

<?xml version="1.0" encoding="UTF-8"?>

<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/j2ee"
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>(my) Services</display-name>
<filter>
    <filter-name>SetCharacterEncodingFilter</filter-name>
    <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
    <init-param>
        <param-name>encoding</param-name>
        <param-value>UTF-8</param-value>
    </init-param>
    <init-param>
        <param-name>forceEncoding</param-name>
        <param-value>true</param-value>
    </init-param>
</filter>
<filter-mapping>
    <filter-name>SetCharacterEncodingFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

<!-- Provide ServletContext -->
<listener>
    <listener-class>my.ServletContextUtils</listener-class>
</listener>

<!-- Expose request to current thread (required for session and request-scoping) -->
<listener>
    <listener-class>org.springframework.web.context.request.RequestContextListener</listener-class>
</listener>

<servlet>
    <servlet-name>spring-mvc</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <init-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>
            WEB-INF/config/spring-mvc-servlet.xml
        </param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
    <servlet-name>spring-mvc</servlet-name>
    <url-pattern>/*</url-pattern>
</servlet-mapping>

</web-app>

А мой spring-mvc-servlet.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:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"   xmlns:util="http://www.springframework.org/schema/util"
xmlns:env="http://my/schema"
xsi:schemaLocation="
    http://www.springframework.org/schema/mvc 
    http://www.springframework.org/schema/mvc/spring-mvc-3.1.xsd
    http://www.springframework.org/schema/beans 
    http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
    http://www.springframework.org/schema/context 
    http://www.springframework.org/schema/context/spring-context-3.1.xsd
    http://www.springframework.org/schema/aop 
    http://www.springframework.org/schema/aop/spring-aop-3.1.xsd
    http://www.springframework.org/schema/tx 
    http://www.springframework.org/schema/tx/spring-tx-3.1.xsd
    http://www.springframework.org/schema/util
    http://www.springframework.org/schema/util/spring-util-3.1.xsd
    http://my/schema
    http://my/schema/env-0.3.xsd">

<env:initialization />
<context:annotation-config />
<mvc:annotation-driven />
<mvc:default-servlet-handler/>
<context:component-scan base-package="my.myresource.restapi" />

<context:property-placeholder
    ignore-unresolvable="true"
    location="
        WEB-INF/config/${my.environment}/webapp.properties" />

<!-- Swagger -->

<!-- swagger config -->
<bean class="my.restapi.swagger.SwaggerConfig"/>

webapp.properties does not contain much:

swagger.include-pattern=/(?!api-docs|version).*

person Nina    schedule 29.06.2015    source источник


Ответы (3)


У меня много приложений, использующих аннотации Spring Rest, и мои API работают с косой чертой в конце или без них.

Это может быть проблема с вашей конфигурацией Spring MVC или с http-сервером, который вы используете.

Не могли бы вы опубликовать несколько фрагментов кода с конфигурациями Spring MVC. Было бы хорошо знать, какую версию Spring вы используете и как вы обслуживаете веб-приложение.

Изменить 1:

Как я прочитал во второй редакции, у вас проблемы с параметрами электронной почты, верно?

Можете ли вы попробовать использовать что-то подобное и сообщить мне, решит ли это проблему?

@RequestMapping(method = GET, value = "/{value1}/{value2}/{value3:.+}"...

Проблема, похоже, связана с точкой в ​​URL-адресе.

Ссылка: Spring MVC @PathVariable с точкой (.) Усекается

person Lucas Saldanha    schedule 29.06.2015
comment
Спасибо за вопрос. Я только что добавил свою конфигурацию. Однако у меня нет проблем с запросами POST. Swagger публикует их правильно и получает отклики. - person Nina; 29.06.2015
comment
Ах да, не видел твоей правки, да, я тоже нашел это сейчас. Это действительно работает! - person Nina; 30.06.2015

Я нашел здесь ответ:

Spring MVC @PathVariable усекается

Кажется, это происходит только с последним параметром, и решение состоит в том, чтобы использовать регулярное выражение для последнего значения:

@RequestMapping(method = GET, value = "/{value1}/{value2}/{value3:.+}"

У меня это работает.

person Nina    schedule 30.06.2015

в вашем файле web.xml

<servlet-mapping>
<servlet-name>spring-mvc</servlet-name>
<url-pattern>/*</url-pattern>

что, если вы попробуете без * just / (как показано на рисунке), какой результат вы получите?

<servlet-mapping>
<servlet-name>spring-mvc</servlet-name>
<url-pattern>/</url-pattern>
person yas    schedule 29.06.2015
comment
@pathvariable с адресом электронной почты похожа на известную проблему. что вы можете посмотреть здесь. ссылка .. 1 и здесь link .. 2 - person yas; 29.06.2015