【问题标题】:How @FeignClient Map Object returned from the Callee Service@FeignClient Map Object 如何从 Callee Service 返回
【发布时间】:2020-02-23 13:46:30
【问题描述】:

我在 rent-service em> 我在 @FeignClient 的帮助下调用 car-serviceGET 方法,该方法返回 Car 类的实例。这个Car 类只存在于car-service中。
所以为了在 rent-service @FeignClientProxy 接口的方法中映射这个对象,我创建了一个名为 CarProxy 的类,它具有完全相同的字段和所有内容作为Car 类。而且这个映射工作正常。

我的问题是即使类是两个不同的,这种映射是如何发生的? @FeignClientJackson 是根据类的字段名称映射这个吗?
是否可以为返回的对象 @FeignClientProxy 方法创建代理类?还是让@Controllermethods 返回HashSetHashMap 中的对象而不是使用像Car 这样的自定义类更好?

//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
}

【问题讨论】:

    标签: rest jackson spring-cloud-feign


    【解决方案1】:

    即使类是两个不同的,这种映射是如何发生的?是 @FeignClient 或 Jackson 根据 上课?

    在幕后使用的Jackson 库并不关心JSON 有效负载是如何创建的以及从哪个类序列化的。如果JSON 有效负载适合您要反序列化的类,它就会这样做。如果不是 - 抛出异常。如果您不想创建POJO,您可以分别使用MapJSON Object 和数组或ListJSON Array

    您可以使用DefaultTypingJackson 将尝试创建与之前用于序列化JSON 相同的类。

    欲了解更多信息,请查看:

    为对象@FeignClientProxy方法创建Proxy类可以吗 回归?还是让@Controllermethods 返回更好 HashSet 或 HashMap 中的对象,而不是使用自定义类 汽车?

    要使两个服务彼此分离,可以安全地在每个服务中创建两个单独的Car 类。大多数情况下它们并不相同,因为 car-management-service 可以在 Car 类中拥有更多字段来处理一些内部操作,而仅在 API 中公开一些。此外,不同的API 方法可能会返回Car 类的不同视图。

    使用地图而不是POJO 会创建非常难看且难以维护的代码。如果您将对象传递到应用程序的其他层,则应避免这种情况。

    另见:

    【讨论】:

      猜你喜欢
      • 2020-06-11
      • 1970-01-01
      • 2016-11-26
      • 1970-01-01
      • 1970-01-01
      • 2020-09-18
      • 1970-01-01
      • 2015-08-27
      • 1970-01-01
      相关资源
      最近更新 更多