@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 @FeignClientProxy 接口的方法中映射这个对象,我创建了一个 class名为 CarProxy,它具有与 Car class 完全相同的字段和所有内容。这个映射工作正常。

我的问题是,即使 classes 是两个不同的,这种映射是如何发生的? @FeignClientJackson 是根据 class 的字段名称映射的吗?
是否可以为返回的对象 @FeignClientProxy 方法创建 Proxy classes?还是对 HashSetHashMap 中的 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

您可以使用 DefaultTypingJackson 将尝试创建与之前用于序列化 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 会创建非常难看且难以维护的代码。如果将对象传递到应用程序的其他层,则应避免这种情况。

另请参阅: