Spring Boot согласование содержимого вручную - PullRequest
0 голосов
/ 26 сентября 2018

Я переделываю старый 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 в классе конфигурации, но, похоже, он не работает:

@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 Ответ

0 голосов
/ 26 сентября 2018

Вы можете использовать HttpServletRequest для значений заголовка запроса.

@Autowire
HttpServletRequest request;

private String getContentType() {
    return request.getHeader("Content-Type");
}
...