首页 > 解决方案 > JPA 实体默认构造函数覆盖 n-args 构造函数

问题描述

如果有默认构造函数,我无法通过 n-args 构造函数初始化实体对象。如果我不指定默认构造函数,我可以通过 POST 请求初始化我的对象。但是,由于没有默认构造函数,我无法获取对象。()

这是我的代码:

@Entity
@Table(name = "result")
public class Result {
    
    @Id
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    private long id;
    
    @Column(name="term")
    private String term;
    
    
    @Column(name="hitsPerYear")
    private int[] hitsPerYear;
    
    @Column(name="year_begin")
    private int year_begin;
    
    @Column(name="year_end")
    private int year_end;
    
    public Result() {
        super();
        System.out.println("Default Constructor");
    }
    
    public Result(String term, int year_begin, int year_end, String key) {
        super();
        System.out.println("n-args constructor");
        this.term = "Some String to see if it works";
        this.year_begin = year_begin;
        this.year_end = year_end;
        int[] someTestArr = {1,2,3,4}
        this.hitsPerYear = someTestArr;
    }
        
    public long getId() {
        return id;
    }
    public void setId(long id) {
        this.id = id;
    }
    public String getTerm() {
        return term;
    }
    public void setTerm(String term) {
        this.term = term;
    }

    
    public int[] getHitsPerYear() {
        return hitsPerYear;
    }


    public void setHitsPerYear(int[] hitsPerYear) {
        this.hitsPerYear = hitsPerYear;
    }
    
    public int getYear_begin() {
        return year_begin;
    }
    public void setYear_begin(int year_begin) {
        this.year_begin = year_begin;
    }
    public int getYear_end() {
        return year_end;
    }
    public void setYear_end(int year_end) {
        this.year_end = year_end;
    }

    

    
    
}

如果我尝试通过 POST 请求初始化类型为 result 的对象:

   {
        "term":"hello",
        "year_begin":2019,
        "year_end":2020,
        "key":"scraperapiKey"
    }

我得到这个回应:

{
    "id": 3,
    "term": "hello",
    "hitsPerYear": null,
    "year_begin": 2019,
    "year_end": 2020
}

在 java 控制台上,我可以看到只有默认构造函数被调用(sysout)。

据我所知,在 jpa 中总是可以通过 n-args 构造函数进行初始化。这有改变吗?

标签: springjpaspring-data-jpa

解决方案


试试这个:

@JsonCreator
public Result(@JsonProperty("term") String term, @JsonProperty("year_begin") int year_begin, @JsonProperty("year_end") int year_end, @JsonProperty("key") String key) {
    this.term = term;
    this.year_begin = year_begin;
    this.year_end = year_end;
    this.key = key;
}

推荐阅读