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, посмотрите на мой вопрос / ответ.