world starter pom plugin hello bom spring-boot spring-boot-actuator

plugin - spring-boot-starter-parent pom



Tipo MIME de respuesta para puntos finales de accionador de arranque por resorte (6)

Basado en el código en https://github.com/spring-projects/spring-boot/issues/2449 (que también funciona bien pero elimina completamente el nuevo tipo) se me ocurrió

@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()}); } }

lo que pone al último tipo de medio de proveedor para que use application/json para todos los puntos finales del actuador cuando no se especifique nada.

Probado con muelle de arranque 1.5.3

He actualizado una aplicación Spring Boot de 1.4.x a 1.5.1 y los puntos finales de Spring Actuator devuelven un tipo MIME diferente ahora:

Por ejemplo, /health ahora es application/vnd.spring-boot.actuator.v1+json lugar de simplemente application/json .

¿Cómo puedo cambiar esto de nuevo?


Como notó, el tipo de contenido para los actuadores ha cambiado en 1.5.x.

Si ingresó "application / json" en el encabezado "Aceptar:" debería obtener el tipo de contenido habitual.

Pero si no tiene ninguna forma de modificar los clientes, este fragmento de código devuelve el estado (sin detalles) y el tipo de contenido original (la forma 1.4.x).

@RestController @RequestMapping(value = "/health", produces = MediaType.APPLICATION_JSON_VALUE) public class HealthController { @Inject HealthEndpoint healthEndpoint; @RequestMapping(method = RequestMethod.GET) public ResponseEntity<Health > health() throws IOException { Health health = healthEndpoint.health(); Health nonSensitiveHealthResult = Health.status(health.getStatus()).build(); if (health.getStatus().equals(Status.UP)) { return ResponseEntity.status(HttpStatus.OK).body(nonSensitiveHealthResult); } else { return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(nonSensitiveHealthResult); } } }

Configuración (alejar salud existente)

endpoints.health.path: internal/health


Desde SpringBoot 2.0.x, la solución sugerida para implementar EndpointHandlerMappingCustomizer ya no funciona.

La buena noticia es que la solución es más simple ahora.

El Bean EndpointMediaTypes necesita ser proporcionado. Lo proporciona la clase SpringBoot WebEndpointAutoConfiguration de forma predeterminada.

Proporcionar su propio podría verse así:

@Configuration public class ActuatorEndpointConfig { private static final List<String> MEDIA_TYPES = Arrays .asList("application/json", ActuatorMediaType.V2_JSON); @Bean public EndpointMediaTypes endpointMediaTypes() { return new EndpointMediaTypes(MEDIA_TYPES, MEDIA_TYPES); } }


En respuesta al comentario de (mi reputación es demasiado baja para crear un comentario): cuando utilizo Firefox para verificar los puntos finales que devuelven JSON, uso el complemento JSONView. En la configuración, hay una opción para especificar tipos de contenido JSON alternativos, simplemente agregue application/vnd.spring-boot.actuator.v1+json y verá el JSON devuelto en una impresión bastante dentro de su navegador.


Los puntos finales devuelven un tipo de contenido que respeta lo que la solicitud del cliente dice que puede aceptar. Obtendrá una respuesta de application/json si el cliente envía un encabezado de Accept que lo solicita:

Accept: application/json


Para admitir la application/vnd.spring-boot.actuator.v1+json en el visor JSON integrado de Firefox, puede instalar este complemento: json-content-type-override . Convierte los tipos de contenido que contienen "json" a "application / json".

Actualización: Firefox 58+ tiene soporte incorporado para estos tipos de mime, y ya no se necesita un complemento. Ver https://bugzilla.mozilla.org/show_bug.cgi?id=1388335