Spring Boot执行器端点的响应MIME类型

时间:2017-02-20 11:26:24

标签: spring-boot spring-boot-actuator

我已将Spring Boot应用程序从1.4.x更新到1.5.1,Spring Actuator端点现在返回不同的MIME类型:

例如,/health现在是application/vnd.spring-boot.actuator.v1+json,而只是application/json

我怎样才能改回来?

6 个答案:

答案 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);
    }
}