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