Spring 引导执行器端点的响应 MIME 类型
Response MIME type for Spring Boot actuator endpoints
我已经将 Spring 引导应用程序从 1.4.x 更新到 1.5.1,并且 Spring 执行器端点 return 现在是不同的 MIME 类型:
例如,/health
现在是 application/vnd.spring-boot.actuator.v1+json
而只是 application/json
。
我怎样才能改回来?
端点return 一种内容类型,它尊重客户端请求所说的它可以接受的内容。如果客户端发送 Accept
header 请求,您将收到 application/json
响应:
Accept: application/json
回应 https://whosebug.com/users/2952093/kap 的评论(我的声誉太低无法发表评论):当使用 Firefox 检查 return JSON 的端点时,我使用 Add-在 JSON 查看。在设置中,有一个选项可以指定备用 JSON 内容类型,只需添加 application/vnd.spring-boot.actuator.v1+json
,您就会在浏览器中看到漂亮的 returned JSON。
如您所见,执行器的内容类型在 1 中发生了变化。5.x。
如果你在 "Accept:" header 中输入 "application/json" 你应该得到通常的 content-type.
但是如果您没有任何修改客户端的方法,此片段 returns 健康(无详细信息)和原始 content-type(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);
}
}
}
配置(移走现有健康)
endpoints.health.path: internal/health
基于 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()});
}
}
将新的 vendor-mediatype 放在最后,以便在未指定任何内容时将 application/json
用于 all 执行器端点。
使用 spring-boot 1.5.3
测试
要在 Firefox 的内置 JSON 查看器中支持 application/vnd.spring-boot.actuator.v1+json
,您可以安装此插件:json-content-type-override。它将包含 "json" 的内容类型转换为 "application/json".
更新: Firefox 58+ 内置了对这些 mime 类型的支持,不再需要插件。参见 https://bugzilla.mozilla.org/show_bug.cgi?id=1388335
自 SpringBoot 2.0.x 实施 EndpointHandlerMappingCustomizer
的建议解决方案不再有效。
好消息是,现在解决方案更简单了。
需要提供Bean EndpointMediaTypes
。默认由SpringBootclassWebEndpointAutoConfiguration
提供
提供您自己的可能如下所示:
@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);
}
}
我已经将 Spring 引导应用程序从 1.4.x 更新到 1.5.1,并且 Spring 执行器端点 return 现在是不同的 MIME 类型:
例如,/health
现在是 application/vnd.spring-boot.actuator.v1+json
而只是 application/json
。
我怎样才能改回来?
端点return 一种内容类型,它尊重客户端请求所说的它可以接受的内容。如果客户端发送 Accept
header 请求,您将收到 application/json
响应:
Accept: application/json
回应 https://whosebug.com/users/2952093/kap 的评论(我的声誉太低无法发表评论):当使用 Firefox 检查 return JSON 的端点时,我使用 Add-在 JSON 查看。在设置中,有一个选项可以指定备用 JSON 内容类型,只需添加 application/vnd.spring-boot.actuator.v1+json
,您就会在浏览器中看到漂亮的 returned JSON。
如您所见,执行器的内容类型在 1 中发生了变化。5.x。
如果你在 "Accept:" header 中输入 "application/json" 你应该得到通常的 content-type.
但是如果您没有任何修改客户端的方法,此片段 returns 健康(无详细信息)和原始 content-type(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);
}
}
}
配置(移走现有健康)
endpoints.health.path: internal/health
基于 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()});
}
}
将新的 vendor-mediatype 放在最后,以便在未指定任何内容时将 application/json
用于 all 执行器端点。
使用 spring-boot 1.5.3
测试要在 Firefox 的内置 JSON 查看器中支持 application/vnd.spring-boot.actuator.v1+json
,您可以安装此插件:json-content-type-override。它将包含 "json" 的内容类型转换为 "application/json".
更新: Firefox 58+ 内置了对这些 mime 类型的支持,不再需要插件。参见 https://bugzilla.mozilla.org/show_bug.cgi?id=1388335
自 SpringBoot 2.0.x 实施 EndpointHandlerMappingCustomizer
的建议解决方案不再有效。
好消息是,现在解决方案更简单了。
需要提供Bean EndpointMediaTypes
。默认由SpringBootclassWebEndpointAutoConfiguration
提供
提供您自己的可能如下所示:
@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);
}
}