我已将Spring Boot应用程序从1.4.x更新到1.5.1,Spring Actuator端点现在返回不同的MIME类型:
例如,/health
现在是application/vnd.spring-boot.actuator.v1+json
,而只是application/json
。
我怎样才能改回来?
答案 0 :(得分:17)
端点返回一种内容类型,该内容类型表示客户端可以接受的请求。如果客户端发送要求它的application/json
标头,您将收到Accept
响应:
Accept: application/json
答案 1 :(得分:14)
响应https://stackoverflow.com/users/2952093/kap的评论(我的声誉很低,无法创建评论):当使用Firefox检查返回JSON的端点时,我使用Add-on JSONView。在设置中,有一个选项可以指定备用JSON内容类型,只需添加application/vnd.spring-boot.actuator.v1+json
,您就可以在浏览器中看到返回的JSON。
答案 2 :(得分:5)
正如您所注意到,执行器的内容类型在1.5.x中已更改。
如果你把" application / json"在"接受:"标题你应该得到通常的内容类型。
但是如果您没有任何修改客户端的方法,那么此代码段将返回运行状况(没有详细信息)和原始内容类型(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
答案 3 :(得分: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()});
}
}
将新的vendor-mediatype设置为last,以便在未指定任何内容时将<{1}}用于所有执行器端点。
使用spring-boot 1.5.3进行测试
答案 4 :(得分:2)
要在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
答案 5 :(得分:1)
自SpringBoot 2.0.x起,实施EndpointHandlerMappingCustomizer
的建议解决方案不再适用。
好消息是,解决方案现在更简单了。
需要提供Bean EndpointMediaTypes
。它默认由SpringBoot类WebEndpointAutoConfiguration
提供。
提供您自己的内容可能如下所示:
@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);
}
}