используя Джексона вместо DTO в POST-отображении? - PullRequest
0 голосов
/ 04 апреля 2020

У меня есть следующие отношения один ко многим:

public class Product {
        @Id
        @SequenceGenerator(name = "product_id_seq", sequenceName = "product_id_seq")
        @GeneratedValue(strategy= GenerationType.SEQUENCE,generator = "product_id_seq")
    private Long pid; // initiate it for just a random value in order to hanlde hibernate bug

    @Id
    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name="manufacturer",referencedColumnName = "id")
    @JsonIdentityInfo(generator= ObjectIdGenerators.PropertyGenerator.class, property="id")
    @JsonIdentityReference(alwaysAsId=true)
    private Manufacturer manufacturer;

   private String name;
   ......more data members...

и производитель:

public class Manufacturer {
    @Id
    @SequenceGenerator(name = "manufacturer_id_seq", sequenceName = "manufacturer_id_seq")
    @GeneratedValue(strategy=GenerationType.SEQUENCE,generator = "manufacturer_id_seq")
    private Long id;
    private String name;
    private String country;
    @OneToMany(mappedBy = "manufacturer",fetch = FetchType.LAZY,cascade = CascadeType.ALL, orphanRemoval = true)
    private List<Product> products;

}

мое тело POST содержит следующее json:

{
    "name":"chocolate",
    "manufacturer": 2,

}

Сейчас я использую DTO и функцию отображения для сопоставления productDTO с продуктом:

public class ProductCreationDTO {
    private String name;
    private Long manufacturer;
}

private Product mapProductCreationDTOtoProduct(ProductCreationDTO pcd)
{
    Product p = modelMapper.map(pcd,Product.class); // maps fields with same name that arent nested(like manufacturer)
    Optional<Manufacturer> o = manufacturerService.getManufacturer(pcd.getManufacturer());
    o.ifPresent(m->p.setManufacturer(m));
    return p;
}

Я преуспел в этом разговоре в своих вызовах get для объектов, добавив эти 2 аннотации над объектом obj в Класс продукта:

@JsonIdentityInfo(generator= ObjectIdGenerators.PropertyGenerator.class, property="id")
@JsonIdentityReference(alwaysAsId=true)

Есть ли способ использовать Джексона (аннотации) для преобразования поста json в объект продукта (десериализация) так же, как это происходит во время остальных вызовов вызова (сериализация)?

1 Ответ

0 голосов
/ 04 апреля 2020

Поэтому вместо использования objectMapper и DTO я изменил json, который я передал следующему:

{
    "name":"chocolate",
    "manufacturer": {"id":2}

}

Спасибо @Lkopo за совет - В аспекте архитектуры лучше создать DTO для передачи данных.

Полный пример с DTO - https://github.com/marielcherkassky/simple_spring_boot_jpa_project

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...