Тип ответа MIME для Spring Конечные точки загрузочного исполнительного механизма
Я обновил приложение загрузки Spring от 1.4.x до 1.5.1, а конечные точки Spring Actuator вернут другой тип MIME:
Например, /health
теперь application/vnd.spring-boot.actuator.v1+json
вместо этого просто application/json
.
Как я могу изменить это?
Ответы
Ответ 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