Spring mvc @RequestBody, как анализировать сущность JPA с помощью @EmbeddedId - PullRequest
0 голосов
/ 06 июля 2018

У меня есть 2 сущности: User и UserAlias.У пользователя есть композитный ПК.У меня есть несколько вопросов:

  1. Как проанализировать JSON весной MVC контроллера для заполнения объектов User и UserPK, например, с этими данными:

    {"id": 1, "name": "newUser", "aliases": ["alias1", "alias2", "alias3"]}

Если я напишу public void createUser(@RequestBody User user), я, очевидно, получуисключение.
Как я могу написать свой метод контроллера для анализа данных для обоих объектов?

На данный момент я использую объект DTO для анализа JSON с @RequestBody и заполнения моделей.Но я не уверен, что это хороший способ выполнить эту задачу.

User.java

@Entity
@Table(name = "user")
public class User {

    @EmbeddedId
    private UserPK userid;

    public User(){}
    public User(UserPK userid) {
        this.userid = userid;
        this.aliases = aliases;
    }

    @OneToMany(
            mappedBy = "user",
            cascade = CascadeType.ALL,
            orphanRemoval = true
    )
    public List<UserAlias> aliases = new ArrayList<>();
    }

UserPK.java

@Embeddable
public class UserPK implements Serializable {

    @NotNull
    @Column(name = "id")
    private Integer id;

    @NotNull
    @Column(name = "name")
    private String name;

    public UserPK(){};

    public UserPK(Integer id, String name){
        this.id = id;
        this.name = name;
    }

}

UserAlias.Ява

@Entity
@Table(name = "user_alias")
public class UserAlias {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "id")
    private Integer id;

    @Column(name = "user_alias")
    private String userAlias;

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumns({
            @JoinColumn(
                    referencedColumnName = "id"),
            @JoinColumn(
                    referencedColumnName = "name")
    })
    @JsonIgnore
    public User user;

    public UserAlias(){}
    public UserAlias(String userAlias) {
        this.userAlias = userAlias;
    }

1 Ответ

0 голосов
/ 06 июля 2018

1. Первый вопрос:

Как проанализировать JSON весной контроллера MVC для заполнения объектов User и UserPK?

Ну, ваш JSON должен соответствовать вашей структуре сущностей, поэтому вам нужно иметь UserId объект внутри вашего User объекта, чтобы соответствовать ожидаемой структуре. В вашем случае JSON, которым вы делитесь, не будет соответствовать этому и будет выдавать исключение при передаче в Spring Controller.

Это то, что вам понадобится как JSON:

{ "userid": {"id" : 1, "name" : "newUser"}, "aliases": [ "alias1", "alias2", "alias3" ] }

2. Второй вопрос:

На данный момент я использую объект DTO для анализа JSON с @RequestBody и заполнения моделей. Но я не уверен, что это хороший способ выполнить эту задачу?

Да, это хороший способ использовать DTO, особенно если вы не хотите сохранять ту же структуру JSON, которую используете сейчас, и, используя переданный DTO, вы можете создать свой объект User соответственно.

Использование @JsonUnwrapped аннотация :

Если вы хотите избежать использования DTO, вы можете просто использовать аннотацию @JsonUnwrapped Джексона , с вашим полем userId, таким образом, его свойства будут быть сериализованным как свойства класса User, и ваш первый JSON будет принят.

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