Spring Bootアプリケーションを1.4.xから1.5.1に更新し、Spring Actuatorエンドポイントが異なるMIMEタイプを返すようになりました。
例えば、 /health
今でしょ application/vnd.spring-boot.actuator.v1+json
代わりに単にapplication/json
。
これを元に戻すにはどうすればよいですか?
エンドポイントは、クライアントのリクエストが受け入れることができると言っている内容を尊重するコンテンツタイプを返します。 application/json
クライアントが要求するAccept
ヘッダーを送信した場合の応答:
Accept: application/json
https://stackoverflow.com/users/2952093/kap (コメントを作成するために評判が低い)のコメントへの応答:Firefoxを使用してJSONを返すエンドポイントをチェックする場合、アドオンJSONView。設定には、代替のJSONコンテンツタイプを指定するオプションがあり、application/vnd.spring-boot.actuator.v1+json
そして、返されたJSONがブラウザ内にきれいに表示されます。
お気づきのように、アクチュエータのコンテンツタイプは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
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でテスト済み
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
を提供する必要があります。デフォルトでは、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);
}
}