Spring MVC возвращает HTTP 406 по URL с точкой

Я обнаружил одно очень странное поведение Spring MVC.

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

@RequestMapping (value = "/delete/{id:.*}", method = RequestMethod.DELETE)
public ResponseEntity<Response> delete(@PathVariable (value = "id") final String id) {
    HttpStatus httpStatus = HttpStatus.OK;
    final Response responseState = new Response( ResponseConstants.STATUS_SUCCESS );
    try {
        POJO pojo = mediaFileDao.findById( id );
        if (pojo != null) {
            delete(pojo);
        } else {
            httpStatus = HttpStatus.NOT_FOUND;
            responseState.setError( "NOT_FOUND" );
        }
    } catch (Exception e) {
        httpStatus = HttpStatus.INTERNAL_SERVER_ERROR;
        responseState.setError( e.getMessage() );
    }
    return new ResponseEntity<>( responseState, httpStatus );
}

Итак, проблема в том, что когда id содержит точку (например, "my_file.wav"), Spring возвращает HTTP 406 в любом случае, но если id не содержит точку, Spring возвращает responseState(как json), как я выражаю. Я пытался исправить это другим способом (добавить @ResponseBody, изменить версию Джексона, понизить Spring до 4.0), но безрезультатно.

Может кто-нибудь мне помочь?

ОБНОВЛЕНИЕ Я включаю журналы для Spring MVN и увидел это

ID содержит точку:

DEBUG org.springframework.web.servlet.mvc.method.annotation.ExceptionHandlerExceptionResolver - Resolving exception from handler [public org.springframework.http.ResponseEntity<my.package.response.Response> my.package.Controller.deleteMediaFile(java.lang.String) throws java.lang.Exception]: org.springframework.web.HttpMediaTypeNotAcceptableException: Could not find acceptable representation
DEBUG org.springframework.web.servlet.mvc.annotation.ResponseStatusExceptionResolver - Resolving exception from handler [public org.springframework.http.ResponseEntity<my.package.response.Response> my.package.Controller.deleteMediaFile(java.lang.String) throws java.lang.Exception]: org.springframework.web.HttpMediaTypeNotAcceptableException: Could not find acceptable representation
DEBUG org.springframework.web.servlet.mvc.support.DefaultHandlerExceptionResolver - Resolving exception from handler [public org.springframework.http.ResponseEntity<my.package.response.Response> my.package.Controller.deleteMediaFile(java.lang.String) throws java.lang.Exception]: org.springframework.web.HttpMediaTypeNotAcceptableException: Could not find acceptable representation

ID не содержит точку:

DEBUG org.springframework.web.servlet.mvc.method.annotation.ResponseBodyAdviceChain - Invoking ResponseBodyAdvice chain for body=my.package.response.Response@1e66a392
DEBUG org.springframework.web.servlet.mvc.method.annotation.ResponseBodyAdviceChain - After ResponseBodyAdvice chain body=my.package.response.Response@1e66a392

РЕШЕНИЕ

Spring не игнорирует расширение файла

SpringMVC: Несоответствующее поведение отображения в зависимости от расширения URL

2 ответа

В xml вашего сервлета отключите сопоставление суффикса Spring:

<mvc:annotation-driven>
    <mvc:path-matching registered-suffixes-only="true"/>
</mvc:annotation-driven>

Это функция, которая позволяет вызывающим абонентам указывать, как они хотят, чтобы их контент возвращался, вставляя его в качестве суффикса в конце URL:

GET /user/bob.json
GET /use/bob.jsp

Но 99 из 100 проектов не используют эту функцию. И это только вызывает проблемы, когда в конце URL появляются точки.

У вас должна быть настроенная служба менеджера согласования контента, подобная этой:

<mvc:annotation-driven content-negotiation-manager="contentNegotiationManager" />

<bean id="contentNegotiationManager" class="org.springframework.web.accept.ContentNegotiationManagerFactoryBean">
    <property name="favorPathExtension" value="false" />
</bean>

Пришел из этой статьи

Другие вопросы по тегам