Согласование содержимого вручную Spring Boot

Я переделываю старый api для отдыха и мне нужно сохранить с ним совместимость. Старый api использует сервлеты и работает как с xml, так и с json. Логика следующая:

  • он проверяет заголовок Content-Type, если он поддерживается ('text / xml', 'application / xml', 'application / json'), он используется как есть;
  • если он не поддерживается (например, '* / *', 'text / plain', 'multipart / form-data') или не существует, используется 'application / xml';
  • тогда заголовок «Accept» проверяется таким же образом с единственным дополнением, если он не имеет того же значения, что и «Content-Type».

Как я могу добиться того же результата с помощью 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*/
}
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
0
638
1

Ответы 1

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

@Autowire
HttpServletRequest request;

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

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