簡體   English   中英

Spring mvc @RequestBody如何使用@EmbeddedId解析JPA實體

[英]Spring mvc @RequestBody how to parse JPA Entity with @EmbeddedId

我有2個實體:User和UserAlias。 用戶有復合PK。 我有一些疑問:

  1. 如何解析Spring MVC控制器中的JSON以填充User和UserPK對象,例如使用以下數據:

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

如果我寫public void createUser(@RequestBody User user)我顯然會得到一個例外。
如何編寫我的控制器方法來解析數據到兩個實體?

  1. 現在我正在使用DTO對象用@RequestBody解析JSON並填充模型。 但我不確定這是完成這項任務的好方法。

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.java

@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.第一個問題:

如何在Spring MVC控制器中解析JSON以填充User和UserPK對象?

那么你的JSON必須與你的實體結構相匹配,所以你需要在User對象中有一個UserId對象才能匹配預期的結構。 在您的情況下,您共享的JSON將不匹配,並且在傳遞給Spring Controller時將拋出異常。

這就是你需要的JSON:

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

2.第二個問題:

現在我正在使用DTO對象用@RequestBody解析JSON並填充模型。 但我不確定這是完成這項任務的好方法嗎?

是的,這是一種使用DTO的好方法,特別是如果你不想保持你現在使用的相同JSON結構,並且使用傳遞的DTO你可以分別構造你的User對象。

使用@JsonUnwrapped注釋

如果你想避免使用DTO ,你可以使用Jackson的@JsonUnwrapped注釋userId字段,這樣它的屬性將被序列化為User類的屬性,你的第一個JSON將被接受。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM