Как объект карты @FeignClient возвращается из службы Callee - PullRequest
1 голос
/ 28 октября 2019

Я создал две простые службы RESTful ( аренда-сервис-управление, авто-управление-сервис ), в аренда-сервис Я вызываю GET метод автосервис с помощью @FeignClient, который возвращает экземпляр класса Car. Этот класс Car находится только в автосервисе . Поэтому, чтобы отобразить этот объект в rent-service @FeignClient Метод прокси-интерфейса, я создал класс с именем CarProxy, который имеет точно такие же поля и все, что и Car класс. И это отображение отлично работает. Мой вопрос: как происходит это отображение, даже если классы два разных? @FeignClient или Jackson отображает это на основе имен полей класса? И нормально ли создавать прокси-классы для объектов @FeignClient возвращаемых прокси-методов? Или лучше сделать @Controller методы для возврата объектов в HashSet или HashMap вместо использования пользовательского класса, такого как 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
}

1 Ответ

0 голосов
/ 28 октября 2019

Как происходит это отображение, даже если классы два разных? @FeignClient или Джексон отображают это на основе имен полей класса?

Jackson библиотеке, которая используется за кулисами, все равно, как создавалась полезная нагрузка JSON и из какого сериализованного класса,Если JSON полезная нагрузка соответствует классу, который вы хотите десериализовать, он просто делает это. Если нет - выкидывает исключение. Если вы не хотите создавать POJO, вы можете использовать Map для JSON Object и массив или List для JSON Array соответственно.

Вы можете использовать DefaultTyping иJackson попытается создать те же классы, которые использовались ранее для сериализации JSON.

Для получения дополнительной информации взгляните на:

Можно ли создавать прокси-классы для объектов, возвращая методы @FeignClientProxy? Или лучше сделать @Controllermethods для возврата объектов в HashSet или HashMap вместо использования пользовательского класса, такого как Car?

Чтобы отделить два сервиса друг от друга, можно создать два отдельных Carзанятия в каждом сервисе. В основном они не совпадают, потому что car-management-service может иметь больше полей в классе Car для обработки некоторых внутренних операций и отображать только некоторые из них в API. Кроме того, различные методы API могут возвращать различные представления класса Car.

Использование карт вместо POJO создает действительно ужасный код, который трудно поддерживать. Вам следует избегать этого, если вы передаете объекты на другие слои вашего приложения.

См. Также:

...