Spring Boot 1.5.x Content-Type如何返回标准的json头

环境:
Spring Boot 1.5.4.RELEASE

启动之后,访问 http://127.0.0.1:8080/env
发现http返回的Content-Type是 application/vnd.spring-boot.actuator.v1+json;charset=UTF-8


contenttype.png


这个不是标准的JSON头,很多浏览器无法识别,直接跳到下载了

请问,如何让它返回的是标准的JSON头application/json;charset=UTF-8
这种,浏览器都可以直接显示出来
 
已邀请:

monkey

赞同来自:

可以在@RequestMapping注解的produces设置, 指定返回的内容类型

itmuch.com - 《Spring Cloud与Docker微服务架构实战》作者

赞同来自:

在Spring Boot 1.5中,有个org.springframework.boot.actuate.endpoint.mvc.ActuatorGetMapping
这个注解代码如下:
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@RequestMapping(method = RequestMethod.GET, produces = {
ActuatorMediaTypes.APPLICATION_ACTUATOR_V1_JSON_VALUE,
MediaType.APPLICATION_JSON_VALUE })
@interface ActuatorGetMapping {
// ...
}
可以看到这是个组合注解,相当于:
@RequestMapping(method = RequestMethod.GET, produces = {
ActuatorMediaTypes.APPLICATION_ACTUATOR_V1_JSON_VALUE,
MediaType.APPLICATION_JSON_VALUE })

这个ActuatorMediaTypes.APPLICATION_ACTUATOR_V1_JSON_VALUE就是您那边的application/vnd.spring-boot.actuator.v1+json这个header,或者APPLICATION_JSON_VALUE(你想要的那个Content-Type)。
=======
各个Actuator端点,例如/health端点,是这么玩的:
// 详见:org.springframework.boot.actuate.endpoint.mvc.HealthMvcEndpoint#invoke

@ActuatorGetMapping
@ResponseBody
public Object invoke(HttpServletRequest request, Principal principal) {
if (!getDelegate().isEnabled()) {
// Shouldn't happen because the request mapping should not be registered
return getDisabledResponse();
}
Health health = getHealth(request, principal);
HttpStatus status = getStatus(health);
if (status != null) {
return new ResponseEntity<Health>(health, status);
}
return health;
}
于是。。你访问Actuator的端点时,就会用那个content-type啦。
=============
分析到这里,答案就很简单了:
只需在请求时,加上Accept:application/json的请求头就可以啦!如下图,我们可以看到响应的Content-Type已经是我们期望的值啦。

111111.png

 

string2020

赞同来自:

有一个方法可以解决,就是加上请求头加上Accept:application/json
但是,直接用浏览器访问,谁会加这个啊,也不好加。

有没有配置,直接控制它返回application/json

springdata

赞同来自:

同问,如何解决这个问题?

梁桂钊 - 后端攻城狮,微信公众号「服务端思维」

赞同来自:

请求头加上 Accept:application/json

要回复问题请先登录注册