Mam dwie klasy modeli. jeden z nich to użytkownik, a drugi to stopień naukowy. każdy użytkownik może uzyskać więcej niż jeden stopień. Chcę wysłać listę stopni wraz z Json, kiedy tworzę nowego użytkownika w postbody.

Moja klasa użytkowników w ten sposób:

    @Entity
    @Table(name = "USERS")
    public class User implements Serializable {
        @Id
        @GeneratedValue(strategy = GenerationType.AUTO)
        private long id;

        private String name = "";

    @ManyToMany(cascade = CascadeType.ALL)
    @JoinTable(
            name = "USER_DEGREE",
            joinColumns = @JoinColumn(name = "USER_FK"),
            inverseJoinColumns = @JoinColumn(name = "DEGREE_FK")
    )
    private List<Degree> degreeList = new ArrayList<>();

    public User setDegreeList(List<Degree> degreeList) {
        this.degreeList = traitList;
        return this;
    }
    public User setId(long id) {
        this.id = id;
        return this;
    }
    public User setName(String name) {
        this.name = name;
        return this;
    }

}

A klasa stopnia ma 3 identyfikator atrybutu, tytuł, punkt.

W moim kontrolerze chcę, gdy używam @RequestBody, aby uzyskać plik json użytkownika w treści, uzyskać wszystkie stopnie użytkownika.

Na przykład mój kontroler:

    @RequestMapping(value = "/user/add",method = RequestMethod.POST)
    @ResponseBody
    public Object sendTechnicalMessage(
            HttpServletRequest request,
            @RequestBody User user
            ){
        return userService.createNewUser(request,user);
    }

I moje ciało json w ten sposób:

{
  name:"abc",
  degreeList:[1,2,4,6] // or [{id:1},{id:2},{id:4}]
}

Jak to zrobić?

0
faez.ham 17 grudzień 2019, 17:17

1 odpowiedź

2 drogi:

  1. Możesz utworzyć klasę DTO z polem Set<Long> zamiast List<Degree>, przekonwertować obiekt użytkownika na ten obiekt UserDTO i zwrócić go.

  2. Możesz użyć tej klasy User, ale z konkretnym Serializatorem. W tym celu zanotuj pole za pomocą @JsonSerialize(using = SomeSerializer.class) i zaimplementuj ten serializator implementujący JsonSerializer<Long> (lub Set<Long> - nie mogę teraz powiedzieć, to tylko pomysł).

Uwaga: pamiętaj, że pola @ManyToMany są domyślnie leniwe (i prawie zawsze muszą być leniwe), więc użyj @Transactional, aby uzyskać kolekcję bez wyjątku.

1
Dmitry Ionash 17 grudzień 2019, 17:28