Eureka 的 Springboot 错误,浏览器显示 xml 而不是 json
Springboot error for Eureka with browsers showing xml instead of json
我使用 Java8 创建了一个微服务,使用 Maven 创建了 SpringBoot。
让我们称它为 MicroServiceA
它有控制器,returns ResponseEntity 对象如下:
@RestController
@RequestMapping("/api")
public class MicroserviceAController {
@GetMapping(value = "/all")
public ResponseEntity<ServiceAResponseWrapper<List<ServiceADto>>> getAll() {
ServiceAResponseWrapper<List<ServiceADto>> wrapper =
new ServiceAResponseWrapper<List<ServiceADto>>(ServiceAResponseStatus.SUCCESS,findAll());
return new ResponseEntity<ServiceAResponseWrapper<List<ServiceADto>>>(wrapper,HttpStatus.OK);
}
public static List<ServiceADto> findAll() {
//returns list of ServiceADto objects
}
}
当我启动此服务并在任何浏览器中对其进行验证时:http://localhost:8073/api/all/,我会显示 JSON 响应。
现在,如果我想将我的服务引入 EUREKA 服务注册中心,那么我需要进行以下更改。
- 创建 EUREKA 服务器微服务。我开始了 - http://localhost:8761/
- 对微服务A做如下修改-
转到pom.xml并添加依赖项
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
转到 application.yml 并添加:
eureka:
client:
registerWithEureka: true
fetch-registry: true
service-url:
defaultZone: http://localhost:8761/eureka/
一旦我开始我的服务,我就开始在服务器上看到它 http://localhost:8761/
现在我再次转到浏览器并尝试检查我的微服务 http://localhost:8073/api/all/ 我看到的是 XML 而不是 JSON。
我什至尝试通过添加修改我的微服务控制器来修复它
我的方法注释:
@Produces( { MediaType.APPLICATION_JSON} )
但是我也看到 XML 而不是 JSON。
我是否遗漏了 EUREKA 的某些内容或它的正常行为?如果是,我该如何解决?
嗨,我自己从未使用过 Eureka,但通过快速搜索,可以使用 API 将 XML 转换为 json,因为 Eureka 使用 XML 和不是 json 因为 json 不能保存属性。
Link 到解释如何执行此操作的站点 ->
https://automationrhapsody.com/json-format-register-service-eureka/amp/
希望这对你有所帮助
如果您使用的是旧版本的 spring cloud starter,您可能需要排除 Jackson 数据格式 XML 依赖项
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka</artifactId>
<exclusions>
<exclusion>
<groupId>com.fasterxml.jackson.dataformat</groupId>
<artifactId>jackson-dataformat-xml</artifactId>
</exclusion>
</exclusions>
</dependency>
对此有两种可能的解决方案:
首先:如果您的应用程序与 XML 转换无关, 从所有 spring-cloud-starter-*
工件中排除 jackson-dataformat-xml
依赖项。 spring-cloud-starter-netflix-eureka-client
中的一个排除示例如下。对于我的情况,我不得不从 spring-cloud-starter-netflix-ribbon
、spring-cloud-starter-openfeign
和 spring-cloud-starter-netflix-eureka-client
中排除 Jackson XML 依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka</artifactId>
<exclusions>
<exclusion>
<groupId>com.fasterxml.jackson.dataformat</groupId>
<artifactId>jackson-dataformat-xml</artifactId>
</exclusion>
</exclusions>
</dependency>
其次:如果要同时支持XML和JSON响应。您可以将 Accept:
header 与请求一起传递给您的 API.
获得JSON响应:
curl -X GET \
http://localhost:8073/api/all/ \
-H 'Accept: application/json'
获得XML响应:
curl -X GET \
http://localhost:8073/api/all/ \
-H 'Accept: application/xml'
我使用 Java8 创建了一个微服务,使用 Maven 创建了 SpringBoot。 让我们称它为 MicroServiceA
它有控制器,returns ResponseEntity 对象如下:
@RestController
@RequestMapping("/api")
public class MicroserviceAController {
@GetMapping(value = "/all")
public ResponseEntity<ServiceAResponseWrapper<List<ServiceADto>>> getAll() {
ServiceAResponseWrapper<List<ServiceADto>> wrapper =
new ServiceAResponseWrapper<List<ServiceADto>>(ServiceAResponseStatus.SUCCESS,findAll());
return new ResponseEntity<ServiceAResponseWrapper<List<ServiceADto>>>(wrapper,HttpStatus.OK);
}
public static List<ServiceADto> findAll() {
//returns list of ServiceADto objects
}
}
当我启动此服务并在任何浏览器中对其进行验证时:http://localhost:8073/api/all/,我会显示 JSON 响应。
现在,如果我想将我的服务引入 EUREKA 服务注册中心,那么我需要进行以下更改。
- 创建 EUREKA 服务器微服务。我开始了 - http://localhost:8761/
- 对微服务A做如下修改-
转到pom.xml并添加依赖项
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
转到 application.yml 并添加:
eureka:
client:
registerWithEureka: true
fetch-registry: true
service-url:
defaultZone: http://localhost:8761/eureka/
一旦我开始我的服务,我就开始在服务器上看到它 http://localhost:8761/
现在我再次转到浏览器并尝试检查我的微服务 http://localhost:8073/api/all/ 我看到的是 XML 而不是 JSON。
我什至尝试通过添加修改我的微服务控制器来修复它 我的方法注释:
@Produces( { MediaType.APPLICATION_JSON} )
但是我也看到 XML 而不是 JSON。
我是否遗漏了 EUREKA 的某些内容或它的正常行为?如果是,我该如何解决?
嗨,我自己从未使用过 Eureka,但通过快速搜索,可以使用 API 将 XML 转换为 json,因为 Eureka 使用 XML 和不是 json 因为 json 不能保存属性。 Link 到解释如何执行此操作的站点 -> https://automationrhapsody.com/json-format-register-service-eureka/amp/
希望这对你有所帮助
如果您使用的是旧版本的 spring cloud starter,您可能需要排除 Jackson 数据格式 XML 依赖项
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka</artifactId>
<exclusions>
<exclusion>
<groupId>com.fasterxml.jackson.dataformat</groupId>
<artifactId>jackson-dataformat-xml</artifactId>
</exclusion>
</exclusions>
</dependency>
对此有两种可能的解决方案:
首先:如果您的应用程序与 XML 转换无关, 从所有 spring-cloud-starter-*
工件中排除 jackson-dataformat-xml
依赖项。 spring-cloud-starter-netflix-eureka-client
中的一个排除示例如下。对于我的情况,我不得不从 spring-cloud-starter-netflix-ribbon
、spring-cloud-starter-openfeign
和 spring-cloud-starter-netflix-eureka-client
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka</artifactId>
<exclusions>
<exclusion>
<groupId>com.fasterxml.jackson.dataformat</groupId>
<artifactId>jackson-dataformat-xml</artifactId>
</exclusion>
</exclusions>
</dependency>
其次:如果要同时支持XML和JSON响应。您可以将 Accept:
header 与请求一起传递给您的 API.
获得JSON响应:
curl -X GET \
http://localhost:8073/api/all/ \
-H 'Accept: application/json'
获得XML响应:
curl -X GET \
http://localhost:8073/api/all/ \
-H 'Accept: application/xml'