Проблема данных Micronaut с отношением «многие ко многим» НЕ возвращает вложенные DTO - PullRequest
1 голос
/ 25 апреля 2020

Я новичок в Micronaut, и я следовал документации, чтобы настроить простое приложение REST. Я думал, что начну с простых отношений «многие ко многим». Казалось, все работает. Таблицы базы данных генерируются при запуске правильно, и конечная точка возвращает элементы, доступные для просмотра, но НЕ вложенный список предложений, даже если я включаю аннотацию извлечения. Что мне не хватает? :-( Не могу понять почему.

Вот что у меня есть ...

Контроллер предметов:

@Get(value = "/{?args*}")
    public Page<ItemDTO> list(@Valid Pageable args) {
        return itemRepository.findAllOrderByName(Pageable.from(args.getNumber(), args.getSize(), args.getSort() ));
    }

Предмет сущности:

@Entity
@Table(name = "item")
public class Item {

    public Item() {}

    public Item(@NotNull String name) {
        this.name = name;
    }

    public static ItemDTO toDTO(Item item) {
        return new ItemDTO(item);
    }

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;

    @Version
    private Long version;

    @NotNull
    @Column(name = "name", nullable = false, unique = true)
    private String name;

    @ManyToMany(fetch = FetchType.EAGER)
    @JoinTable(
            name = "item_offer",
            joinColumns = @JoinColumn(name = "item_id"),
            inverseJoinColumns = @JoinColumn(name = "offer_id"))
    private Set<Offer> offers = new HashSet<>();

    public Long getId() {
        return id;
    }

    public String getName() {
        return name;
    }

    public Set<Offer> getOffers() {
        return offers;
    }

    public Item setOffers(Set<Offer> offers) {
        this.offers = offers;
        return this;
    }

    public Item addOffer(Offer offer) {
        offers.add(offer);
        offer.getItems().add(this);
        return this;
    }

}

Элемент DTO:

@Introspected
public class ItemDTO {

    @NotNull
    private String name;

    private Set<OfferDTO> offers = new HashSet<>();

    public ItemDTO() {
    }

    public ItemDTO(String name) {
        this.name = name;
    }

    public ItemDTO(Item item) {
        this.name = item.getName();
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

}

Объект предложения:

@Entity
@Table(name = "offer")
public class Offer {

    public Offer() { }

    public Offer(String name) {
        this.name = name;
    }

    public static OfferDTO toDTO(Offer offer) {
        return new OfferDTO(offer);
    }

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;

    @Version
    private Long version;

    @Column(name = "name", nullable = false, unique = true)
    private String name;

    @ManyToMany(mappedBy = "offers", fetch = FetchType.EAGER)
    private Set<Item> items = new HashSet<>();

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public Long getVersion() {
        return version;
    }

    public void setVersion(Long version) {
        this.version = version;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Set<Item> getItems() {
        return items;
    }

    public void setItems(Set<Item> items) {
        this.items = items;
    }
}

Предложение DTO:

@Introspected
public class OfferDTO {

    @NotNull
    private String name;

    public OfferDTO() {
    }

    public OfferDTO(String name) {
        this.name = name;
    }

    public OfferDTO(Offer offer) {
        this.name = offer.getName();
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

}

Репозиторий элементов:

import io.micronaut.data.model.Page;
import io.micronaut.data.model.Pageable;
import io.micronaut.data.repository.PageableRepository;
import knitwizzs.domains.Item;
import knitwizzs.dtos.ItemDTO;

public interface ItemRepository extends PageableRepository<Item, Long> {

    Page<ItemDTO> findAllOrderByName(Pageable pageable);

}

Вот вывод, который я получаю:

{
"content": [
{
"name": "Item name one"
},
{
"name": "Item name two"
}
],
"pageable": {
"number": 0,
"sort": {
"sorted": false
},
"size": 100,
"offset": 0,
"sorted": false
},
"totalSize": 2,
"totalPages": 1,
"empty": false,
"size": 100,
"offset": 0,
"pageNumber": 0,
"numberOfElements": 2
}

Так что никаких признаков вложенных предложений?

Вот и все. Поскольку я использую данные Micronaut, я предполагал, что это будет работать. Очевидно Я что-то пропустил.

Заранее благодарю за любую полезную информацию.

1 Ответ

1 голос
/ 25 апреля 2020

Аннотация @JsonIgnore исключит это поле из вывода JSON, поскольку оно эффективно игнорируется во время сериализации.

Таким образом, вы можете просто изменить свое поле в классе ItemDTO с:

@JsonIgnore
private Set<OfferDTO> offers = new HashSet<>();

до:

private Set<OfferDTO> offers = new HashSet<>();
...