Подтвердить что ты не робот

Тип ответа MIME для Spring Конечные точки загрузочного исполнительного механизма

Я обновил приложение загрузки Spring от 1.4.x до 1.5.1, а конечные точки Spring Actuator вернут другой тип MIME:

Например, /health теперь application/vnd.spring-boot.actuator.v1+json вместо этого просто application/json.

Как я могу изменить это?

4b9b3361

Ответ 1

Конечные точки возвращают тип контента, который отличает то, что клиентский запрос говорит, что он может принять. Вы получите ответ application/json, если клиент отправит заголовок Accept, который запрашивает его:

Accept: application/json

Ответ 2

В ответ на комментарий https://stackoverflow.com/users/2952093/kap (моя репутация низкая, чтобы создать комментарий): при использовании Firefox для проверки конечных точек, возвращающих JSON, я использую Добавить JSONView. В настройках есть опция указать альтернативные типы содержимого JSON, просто добавьте application/vnd.spring-boot.actuator.v1+json, и вы увидите, что возвращенный JSON находится в довольно печатном виде внутри вашего браузера.

Ответ 3

Как вы заметили, тип контента для исполнительных механизмов изменился в 1.5.x.

Если вы поставили "application/json" в заголовок "Accept:", вы должны получить обычный тип содержимого.

Но если у вас нет способа изменить клиентов, этот фрагмент возвращает работоспособность (без деталей) и оригинальный тип содержимого (путь 1.4.x).

@RestController
@RequestMapping(value = "/health", produces = MediaType.APPLICATION_JSON_VALUE)
public class HealthController {

    @Inject
    HealthEndpoint healthEndpoint;

    @RequestMapping(method = RequestMethod.GET)
    @Timed
    public Health health() throws IOException {
        Health health = healthEndpoint.invoke();
        return Health.status(health.getStatus()).build();
    }
}

Конфигурация (удалите существующее здоровье)

endpoints.health.path: internal/health

Ответ 4

На основе кода в https://github.com/spring-projects/spring-boot/issues/2449 (который также отлично работает, но полностью удаляет новый тип), я придумал

@Component
public class ActuatorCustomizer implements EndpointHandlerMappingCustomizer {

    static class Fix extends HandlerInterceptorAdapter {


        @Override
        public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
                throws Exception {
            Object attribute = request.getAttribute(HandlerMapping.PRODUCIBLE_MEDIA_TYPES_ATTRIBUTE);
            if (attribute instanceof LinkedHashSet) {
                @SuppressWarnings("unchecked")
                LinkedHashSet<MediaType> lhs = (LinkedHashSet<MediaType>) attribute;
                if (lhs.remove(ActuatorMediaTypes.APPLICATION_ACTUATOR_V1_JSON)) {
                    lhs.add(ActuatorMediaTypes.APPLICATION_ACTUATOR_V1_JSON);
                }
            }
            return true;
        }

    }

    @Override
    public void customize(EndpointHandlerMapping mapping) {
        mapping.setInterceptors(new Object[] {new Fix()});
    }
}

который помещает новый вид медикамента-поставщика последним, чтобы он использовал application/json для всех конечных точек исполнительного механизма, когда ничего не указано.

Протестировано с помощью spring -boot 1.5.3

Ответ 5

Чтобы поддерживать application/vnd.spring-boot.actuator.v1+json в Firefox, встроенном в JSON viewer, вы можете установить этот аддон: json-content-type-override. Он преобразует типы контента, содержащие "json" в "application/json".

Обновление: У Firefox 58+ есть встроенная поддержка этих типов mime, и аддон больше не нужен. См. https://bugzilla.mozilla.org/show_bug.cgi?id=1388335