Как отключить согласование содержимого для Spring Actuators?

Я хотел бы отключить Content-Negotiation, когда вызываются конечные точки исполнительного механизма /info и /health

вот мой файл конфигурации

@Configuration
public class InterceptorAppConfig implements WebMvcConfigurer {

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(interceptor);
    }

    @Override
    public void configureContentNegotiation(ContentNegotiationConfigurer configurer) {
        configurer.defaultContentType(MediaType.APPLICATION_XML)
                .mediaType("json", MediaType.APPLICATION_JSON)
                .mediaType("xml", MediaType.APPLICATION_XML);
    }
}

Когда я curl http://localhost:8081/health

Я получил:

DefaultHandlerExceptionResolver Resolved [org.springframework.web.HttpMediaTypeNotAcceptableException: Could not find acceptable representation]

Однако, когда я запускаю тот же URL-адрес в Chrome, я получаю правильный ответ.

В моем случае привод должен вызываться без заголовков (без -H 'Accept: ...')


person Alex    schedule 22.11.2019    source источник
comment
configurer.ignoreAcceptHeader(true) соответствует вашим потребностям?   -  person Dirk Deyne    schedule 22.11.2019
comment
нет, мне все еще нужно иметь возможность отправлять запросы GET с заголовками, например. -H 'Принять: приложение / json' и xml   -  person Alex    schedule 22.11.2019


Ответы (2)


Добавьте defaultContentTypeStrategy и обработайте ноль или подстановочный знак.

@Override
public void configureContentNegotiation(ContentNegotiationConfigurer configurer) {
    configurer.defaultContentType(MediaType.APPLICATION_XML)
    .mediaType("json", MediaType.APPLICATION_JSON)
    .mediaType("xml", MediaType.APPLICATION_XML);

    configurer.defaultContentTypeStrategy(new ContentNegotiationStrategy() {
        @Override
        public List<MediaType> resolveMediaTypes(NativeWebRequest webRequest) throws HttpMediaTypeNotAcceptableException {
            // If you want handle different cases by getting header with webRequest.getHeader("accept")
            return Arrays.asList(MediaType.APPLICATION_JSON);
        }
    });       
}
person Pasupathi Rajamanickam    schedule 22.11.2019
comment
Спасибо, но это просто переопределяет тип содержимого по умолчанию, который установлен на XML configurer.defaultContentType(MediaType.APPLICATION_XML) - person Alex; 25.11.2019

К сожалению, я могу предложить только неоптимальное решение.

@Override
public void configureContentNegotiation(ContentNegotiationConfigurer configurer) {
    configurer
            .mediaType("json", MediaType.APPLICATION_JSON)
            .mediaType("xml", MediaType.APPLICATION_XML)
            .defaultContentTypeStrategy((webRequest) -> {
                final String servletPath = ((HttpServletRequest) webRequest.getNativeRequest()).getServletPath();
                final MediaType defaultContentType = Arrays.asList("/info", "/health").contains(servletPath)
                        ? MediaType.APPLICATION_JSON : MediaType.APPLICATION_XML;
                return Collections.singletonList(defaultContentType);
            });
}

В случае вызова конечных точек /info или /health возвращается application/json. Во всех остальных запросах используется значение по умолчанию application/xml.

person Sven Döring    schedule 19.03.2020