web-dev-qa-db-ja.com

Spring Bootアクチュエータエンドポイントの応答MIMEタイプ

Spring Bootアプリケーションを1.4.xから1.5.1に更新し、Spring Actuatorエンドポイントが異なるMIMEタイプを返すようになりました。

例えば、 /health 今でしょ application/vnd.spring-boot.actuator.v1+json代わりに単にapplication/json

これを元に戻すにはどうすればよいですか?

23
kap

エンドポイントは、クライアントのリクエストが受け入れることができると言っている内容を尊重するコンテンツタイプを返します。 application/jsonクライアントが要求するAcceptヘッダーを送信した場合の応答:

Accept: application/json
17
Andy Wilkinson

https://stackoverflow.com/users/2952093/kap (コメントを作成するために評判が低い)のコメントへの応答:Firefoxを使用してJSONを返すエンドポイントをチェックする場合、アドオンJSONView。設定には、代替のJSONコンテンツタイプを指定するオプションがあり、application/vnd.spring-boot.actuator.v1+jsonそして、返されたJSONがブラウザ内にきれいに表示されます。

14
loïc

お気づきのように、アクチュエータのコンテンツタイプは1.5.xで変更されました。

「Accept:」ヘッダーに「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
5
hirro

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

何も指定されていない場合にallアクチュエータエンドポイントにapplication/jsonを使用するように、新しいベンダーメディアタイプを最後に配置します。

Spring-boot 1.5.3でテスト済み

4
zapl

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 を参照してください

2
Bian Jiaping

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);
    }
}
1
CyclingSir