@FeignClient Map对象如何从Callee Service返回
How @FeignClient Map Object returned from the Callee Service
我创建了两个简单的 RESTful 服务(rent-management-service, car-management-service),在rent-service 我正在调用 car-service[ 的 GET
方法=44=] 在 @FeignClient
的帮助下 returns Car
class 的实例。此 Car
class 仅驻留在 car-service.
所以为了在 rent-service @FeignClient
Proxy 接口的方法中映射这个对象,我创建了一个 class名为 CarProxy
,它具有与 Car
class 完全相同的字段和所有内容。这个映射工作正常。
我的问题是,即使 classes 是两个不同的,这种映射是如何发生的? @FeignClient
或 Jackson
是根据 class 的字段名称映射的吗?
是否可以为返回的对象 @FeignClient
Proxy 方法创建 Proxy classes?还是对 HashSet
或 HashMap
中的 returns 对象制作 @Controller
方法比使用像 Car
这样的自定义 class 更好?
//Car class Only in Car-management-service
@Entity
@Table(name = "CAR")
public class Car {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "CAR_ID")
private Long carId;
@Column(name = "REG_NUM")
private String regNumber;
@Column(name = "BRAND")
private String brand;
@Column(name = "MODEL")
private String model;
//Getter,Setter,Constructor below
}
//Controller in car-management-service which returns Car object
@RestController
@RequestMapping("/car-service")
public class CarInfoController {
@Autowired
CarService service;
@GetMapping(path = "/getCarInfo/{Id}")
public Car getCarDetails(@PathVariable Long Id) {
if (Id == null)
throw new IllegalArgumentException("Id is Null");
return service.findCarById(Id);
}
}
//FeignClient interface in rent-management-service which calls car-service GET endpoint
@FeignClient(name = "car-management-service", url = "localhost:8100/car-service")
public interface CarManagementServiceProxy {
@GetMapping(path = "/getCarInfo/{Id}")
public CarProxy getCarDetails(@PathVariable("Id") Long Id);
}
//CarProxy class in rent-service which is a clone to Car class in car-service
public class CarProxy {
private Long carId;
private String regNumber;
private String brand;
private String model;
//Getter,Setter,Constructor below
}
How this mapping happens even if classes are Two different? Is
@FeignClient or Jackson maps this based on the field names of the
class?
Jackson
在幕后使用的库不关心 JSON
有效负载是如何创建的以及 class 从中序列化的。如果 JSON
有效负载适合您要反序列化的 class,它就会执行。如果不是 - 抛出异常。如果您不想创建 POJO
,您可以分别对 JSON Object
和数组使用 Map
或对 JSON Array
使用 List
。
您可以使用 DefaultTyping,Jackson
将尝试创建与之前用于序列化 JSON
.
相同的 classes
有关更多信息,请查看:
Is it OK to create Proxy classes for objects @FeignClientProxy methods
returning? Or is it better to make @Controllermethods to returns
objects in HashSet or HashMap instead of using a Custom class like
Car?
为了将两个服务相互分离,在每个服务中创建两个单独的 Car
class 是安全的。大多数情况下它们是不一样的,因为 car-management-service 可以在 Car
class 中有更多字段来处理一些内部操作,而只在 [=] 中公开一些22=]。此外,不同的 API
方法可能 return 对 Car
class 的不同看法。
使用地图而不是 POJO
会创建非常难看且难以维护的代码。如果将对象传递到应用程序的其他层,则应避免这种情况。
另请参阅:
我创建了两个简单的 RESTful 服务(rent-management-service, car-management-service),在rent-service 我正在调用 car-service[ 的 GET
方法=44=] 在 @FeignClient
的帮助下 returns Car
class 的实例。此 Car
class 仅驻留在 car-service.
所以为了在 rent-service @FeignClient
Proxy 接口的方法中映射这个对象,我创建了一个 class名为 CarProxy
,它具有与 Car
class 完全相同的字段和所有内容。这个映射工作正常。
我的问题是,即使 classes 是两个不同的,这种映射是如何发生的? @FeignClient
或 Jackson
是根据 class 的字段名称映射的吗?
是否可以为返回的对象 @FeignClient
Proxy 方法创建 Proxy classes?还是对 HashSet
或 HashMap
中的 returns 对象制作 @Controller
方法比使用像 Car
这样的自定义 class 更好?
//Car class Only in Car-management-service
@Entity
@Table(name = "CAR")
public class Car {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "CAR_ID")
private Long carId;
@Column(name = "REG_NUM")
private String regNumber;
@Column(name = "BRAND")
private String brand;
@Column(name = "MODEL")
private String model;
//Getter,Setter,Constructor below
}
//Controller in car-management-service which returns Car object
@RestController
@RequestMapping("/car-service")
public class CarInfoController {
@Autowired
CarService service;
@GetMapping(path = "/getCarInfo/{Id}")
public Car getCarDetails(@PathVariable Long Id) {
if (Id == null)
throw new IllegalArgumentException("Id is Null");
return service.findCarById(Id);
}
}
//FeignClient interface in rent-management-service which calls car-service GET endpoint
@FeignClient(name = "car-management-service", url = "localhost:8100/car-service")
public interface CarManagementServiceProxy {
@GetMapping(path = "/getCarInfo/{Id}")
public CarProxy getCarDetails(@PathVariable("Id") Long Id);
}
//CarProxy class in rent-service which is a clone to Car class in car-service
public class CarProxy {
private Long carId;
private String regNumber;
private String brand;
private String model;
//Getter,Setter,Constructor below
}
How this mapping happens even if classes are Two different? Is @FeignClient or Jackson maps this based on the field names of the class?
Jackson
在幕后使用的库不关心 JSON
有效负载是如何创建的以及 class 从中序列化的。如果 JSON
有效负载适合您要反序列化的 class,它就会执行。如果不是 - 抛出异常。如果您不想创建 POJO
,您可以分别对 JSON Object
和数组使用 Map
或对 JSON Array
使用 List
。
您可以使用 DefaultTyping,Jackson
将尝试创建与之前用于序列化 JSON
.
有关更多信息,请查看:
Is it OK to create Proxy classes for objects @FeignClientProxy methods returning? Or is it better to make @Controllermethods to returns objects in HashSet or HashMap instead of using a Custom class like Car?
为了将两个服务相互分离,在每个服务中创建两个单独的 Car
class 是安全的。大多数情况下它们是不一样的,因为 car-management-service 可以在 Car
class 中有更多字段来处理一些内部操作,而只在 [=] 中公开一些22=]。此外,不同的 API
方法可能 return 对 Car
class 的不同看法。
使用地图而不是 POJO
会创建非常难看且难以维护的代码。如果将对象传递到应用程序的其他层,则应避免这种情况。
另请参阅: