如何为 Spring 个执行器禁用内容协商?
How to disable content negotiation for Spring Actuators?
我想在执行器端点 /info
和 /health
被调用时禁用 Content-Negotiation
这是我的配置文件
@Configuration
public class InterceptorAppConfig implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(interceptor);
}
@Override
public void configureContentNegotiation(ContentNegotiationConfigurer configurer) {
configurer.defaultContentType(MediaType.APPLICATION_XML)
.mediaType("json", MediaType.APPLICATION_JSON)
.mediaType("xml", MediaType.APPLICATION_XML);
}
}
当我curl http://localhost:8081/health
我收到:
DefaultHandlerExceptionResolver Resolved [org.springframework.web.HttpMediaTypeNotAcceptableException: Could not find acceptable representation]
然而,当我在 Chrome 中触发相同的 url 时,我收到了有效响应。
在我的例子中,应该在没有 headers 的情况下调用执行器(没有 -H 'Accept: ...')
添加 defaultContentTypeStrategy
并处理 null 或通配符接受。
@Override
public void configureContentNegotiation(ContentNegotiationConfigurer configurer) {
configurer.defaultContentType(MediaType.APPLICATION_XML)
.mediaType("json", MediaType.APPLICATION_JSON)
.mediaType("xml", MediaType.APPLICATION_XML);
configurer.defaultContentTypeStrategy(new ContentNegotiationStrategy() {
@Override
public List<MediaType> resolveMediaTypes(NativeWebRequest webRequest) throws HttpMediaTypeNotAcceptableException {
// If you want handle different cases by getting header with webRequest.getHeader("accept")
return Arrays.asList(MediaType.APPLICATION_JSON);
}
});
}
很遗憾,我只能提供一个次优的解决方案。
@Override
public void configureContentNegotiation(ContentNegotiationConfigurer configurer) {
configurer
.mediaType("json", MediaType.APPLICATION_JSON)
.mediaType("xml", MediaType.APPLICATION_XML)
.defaultContentTypeStrategy((webRequest) -> {
final String servletPath = ((HttpServletRequest) webRequest.getNativeRequest()).getServletPath();
final MediaType defaultContentType = Arrays.asList("/info", "/health").contains(servletPath)
? MediaType.APPLICATION_JSON : MediaType.APPLICATION_XML;
return Collections.singletonList(defaultContentType);
});
}
如果调用 /info
或 /health
端点,则返回 application/json
。对于所有其他请求,使用默认 application/xml
。
我想在执行器端点 /info
和 /health
被调用时禁用 Content-Negotiation
这是我的配置文件
@Configuration
public class InterceptorAppConfig implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(interceptor);
}
@Override
public void configureContentNegotiation(ContentNegotiationConfigurer configurer) {
configurer.defaultContentType(MediaType.APPLICATION_XML)
.mediaType("json", MediaType.APPLICATION_JSON)
.mediaType("xml", MediaType.APPLICATION_XML);
}
}
当我curl http://localhost:8081/health
我收到:
DefaultHandlerExceptionResolver Resolved [org.springframework.web.HttpMediaTypeNotAcceptableException: Could not find acceptable representation]
然而,当我在 Chrome 中触发相同的 url 时,我收到了有效响应。
在我的例子中,应该在没有 headers 的情况下调用执行器(没有 -H 'Accept: ...')
添加 defaultContentTypeStrategy
并处理 null 或通配符接受。
@Override
public void configureContentNegotiation(ContentNegotiationConfigurer configurer) {
configurer.defaultContentType(MediaType.APPLICATION_XML)
.mediaType("json", MediaType.APPLICATION_JSON)
.mediaType("xml", MediaType.APPLICATION_XML);
configurer.defaultContentTypeStrategy(new ContentNegotiationStrategy() {
@Override
public List<MediaType> resolveMediaTypes(NativeWebRequest webRequest) throws HttpMediaTypeNotAcceptableException {
// If you want handle different cases by getting header with webRequest.getHeader("accept")
return Arrays.asList(MediaType.APPLICATION_JSON);
}
});
}
很遗憾,我只能提供一个次优的解决方案。
@Override
public void configureContentNegotiation(ContentNegotiationConfigurer configurer) {
configurer
.mediaType("json", MediaType.APPLICATION_JSON)
.mediaType("xml", MediaType.APPLICATION_XML)
.defaultContentTypeStrategy((webRequest) -> {
final String servletPath = ((HttpServletRequest) webRequest.getNativeRequest()).getServletPath();
final MediaType defaultContentType = Arrays.asList("/info", "/health").contains(servletPath)
? MediaType.APPLICATION_JSON : MediaType.APPLICATION_XML;
return Collections.singletonList(defaultContentType);
});
}
如果调用 /info
或 /health
端点,则返回 application/json
。对于所有其他请求,使用默认 application/xml
。