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

В моем Spring XML у меня есть следующий фрагмент:

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

<mvc:annotation-driven>
    <mvc:message-converters>
        <bean class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter">
            <property name="objectMapper" ref="objectMapper" />
        </bean>        
    </mvc:message-converters>
</mvc:annotation-driven>

Из того, что я понимаю, это означает, что Spring НЕ должен регистрировать "abc.*" И "abc/", когда у меня есть отображение для "abc".

В одном из моих контроллеров у меня есть метод, который записывает изображение в ответ:

@RequestMapping(value="{path}", method=RequestMethod.GET, produces=MediaType.IMAGE_PNG_VALUE)
@ResponseBody
public void getPath(
        @PathVariable String path,
        HttpServletResponse res) {

    ...
}

Это прекрасно работает, когда я запрашиваю что-то вроде "abc", но когда я запрашиваю "abc.com", выдается ошибка 406 с текстом:

The resource identified by this request is only capable of generating responses with characteristics not acceptable according to the request "accept" headers."

Когда я запрашиваю "abc.img", параметр "path" получает только текст "abc"; Весна опускает расширение.

Кажется, что Spring неправильно игнорирует шаблон суффикса. Почему это?

Редактировать: я перевел конфигурацию java из комментария Дирка, и следующий XML, похоже, решил эту проблему:

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

<mvc:annotation-driven content-negotiation-manager="contentNegotiationManager">
    <mvc:message-converters>
        <bean class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter">
            <property name="objectMapper" ref="objectMapper" />
        </bean>        
    </mvc:message-converters>
</mvc:annotation-driven>

Я все еще не уверен, почему оригинальный код, который у меня был, не работал, но это решило мою проблему

1 ответ

Решение

Когда к диспетчеру пружин поступает запрос, часть сопоставления / сопоставления контроллеров сопоставляет принятые типы носителей на стороне клиента с производимыми типами носителей на стороне контроллера (поэтому вы можете иметь контроллеры, которые различаются только по их произведенным типам носителей),

Плохая новость заключается в том, что springmvc в конфигурации по умолчанию поддерживает расширение запрошенного URL-адреса поверх любого заголовка accept в запросе.

В вашем примере, когда вы запрашиваете abc в расширении нет соответствия, поэтому другие согласованные стратегии согласования в конечном итоге приводят к правильному типу (через accept заголовок). Но если вы запросите abc.com весна выведет тип пантомимы application/octet-stream это не соответствует produces вашего контроллера и генерации 406 (потому что нет соответствующего контроллера).

Вы можете найти соответствие mime по умолчанию для расширений пути в spring-context-support.jar в org/springframework/mail/javamail/mime.types (см. https://github.com/spring-projects/spring-framework/blob/master/spring-context-support/src/main/resources/org/springframework/mail/javamail/mime.types).

Вы можете отключить эту "функцию" в конфигурации диспетчера, чтобы Spring не использовала расширение пути для разрешения mime-типа:

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

Если вы используете конфигурацию java, посмотрите на мой вопрос / ответ.

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