Spring Boot согласование содержимого вручную
Я переделываю старый api rest и мне нужно сохранить совместимость с ним. Старый API использует сервлеты и работает как с XML, так и с JSON. Логика следующая:
- он проверяет заголовок "Content-Type", если он поддерживается ("text / xml", "application / xml", "application/json"), он используется как есть;
- если он не поддерживается (например, "*/*", "text / plain", "multipart/form-data") или не существует, используется "application / xml";
- затем заголовок "Принять" проверяется таким же образом, с единственным дополнением, если в нем нет того же значения, что и "Тип контента".
Как я могу добиться того же результата с Spring MVC (используя Spring Boot)? Я попытался переопределить configureContentNegotiation в классе config, но, похоже, он не работает:
@SpringBootApplication
@EnableAutoConfiguration(exclude = {DataSourceAutoConfiguration.class})
@ComponentScan(basePackages = {"..."})
public class AppConfiguration extends WebMvcConfigurerAdapter {
@Override
public void configureContentNegotiation(ContentNegotiationConfigurer configurer) {
configurer.defaultContentTypeStrategy((NativeWebRequest request) -> {
String header = request.getHeader("Content-Type");
MediaType mediaType;
if (Objects.isNull(header)) {
mediaType = MediaType.APPLICATION_XML;
} else switch (header) {
case MediaType.TEXT_XML_VALUE:
case MediaType.APPLICATION_XML_VALUE:
case MediaType.APPLICATION_JSON_VALUE:
case MediaType.APPLICATION_JSON_UTF8_VALUE:
mediaType = MediaType.valueOf(header);
break;
default:
mediaType = MediaType.APPLICATION_XML;
}
return Arrays.asList(mediaType);
});
}
/*the rest of configuration*/
}
1 ответ
Вы можете использовать HttpServletRequest для значений заголовка запроса.
@Autowire
HttpServletRequest request;
private String getContentType() {
return request.getHeader("Content-Type");
}