私は、次のOneToManyの関係が含まれていjobprofileと呼ばれるクラスを、持っている:の永続化OneToMany関係
@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER, mappedBy = "profile")
private List<JobLanguageProficiency> jobLanguageProficiency;
参照先のクラス "JobLanguageProficiency" は次のようになります。基本的には
package ch.alv.jobmatch.entity.aux;
import ch.alv.jobmatch.entity.job.Jobprofile;
import javax.persistence.*;
@Entity
@Table(name = "job_language_proficiency")
public class JobLanguageProficiency {
@Id
private int id;
@ManyToOne
@JoinColumn(name = "jobprofile_jobprofile_id")
private Jobprofile profile;
@OneToOne
private Languages languages;
@OneToOne
private LangProficiency langProficiency;
public Languages getLanguages() {
return languages;
}
public void setLanguages(Languages languages) {
this.languages = languages;
}
public LangProficiency getLangProficiency() {
return langProficiency;
}
public void setLangProficiency(LangProficiency langProficiency) {
this.langProficiency = langProficiency;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public Jobprofile getProfile() {
return profile;
}
public void setProfile(Jobprofile profile) {
this.profile = profile;
}
}
、それはちょうど言語への2つの参照とそのための熟練を含んでいます。
ジョブプロファイルを作成/保持しようとすると、言語データをデータベースに挿入しようとするとすぐに失敗します。
これはエラーです:
Failed to write HTTP message: org.springframework.http.converter.HttpMessageNotWritableException:
Could not write content: (was java.lang.NullPointerException) (through reference chain: org.springframework.data.rest.webmvc.json.["content"]); nested exception is com.fasterxml.jackson.databind.JsonMappingException: (was java.lang.NullPointerException) (through reference chain: org.springframework.data.rest.webmvc.json.["content"])
私は手動でデータを挿入する際OneToMany関係は完璧に動作するので、エラーの原因は、JSONにあると思います。
JSONの関連部分は次のようになります。
job_language_proficiency: Array[1]
0: Object
languages: "http://localhost:9000/api/languages/de"
proficiency_code: "http://localhost:9000/api/langproficiency/C1"
これが動作しない理由を任意のアイデア?
EDIT:リンクの代わりにオブジェクトが含まれるようにJSONを更新しました。
LangProficiencyエンティティ:
package ch.alv.jobmatch.entity.aux;
import javax.persistence.*;
@Entity
@Table(name = "LangProficiency")
public class LangProficiency {
@Id
@Column(name = "proficiency_code")
private String proficiency_code;
private String description_de;
private String description_fr;
private String description_it;
private String description_en;
public String getProficiency_code() {
return proficiency_code;
}
public void setProficiency_code(String proficiency_code) {
this.proficiency_code = proficiency_code;
}
public String getDescription_de() {
return description_de;
}
public void setDescription_de(String description_de) {
this.description_de = description_de;
}
public String getDescription_fr() {
return description_fr;
}
public void setDescription_fr(String description_fr) {
this.description_fr = description_fr;
}
public String getDescription_it() {
return description_it;
}
public void setDescription_it(String description_it) {
this.description_it = description_it;
}
public String getDescription_en() { return description_en; }
public void setDescription_en(String description_en) { this.description_en = description_en; }
}
言語エンティティ:
package ch.alv.jobmatch.entity.aux;
import javax.persistence.*;
import java.io.Serializable;
@Entity
@Table(name = "Languages")
public class Languages implements Serializable {
@Id
@Column(name = "languages")
private String languages;
private String description_de;
private String description_fr;
private String description_it;
private String description_en;
public String getLanguages() {
return languages;
}
public void setLanguages(String languages) {
this.languages = languages;
}
public String getDescription_de() {
return description_de;
}
public void setDescription_de(String description_de) {
this.description_de = description_de;
}
public String getDescription_fr() {
return description_fr;
}
public void setDescription_fr(String description_fr) {
this.description_fr = description_fr;
}
public String getDescription_it() {
return description_it;
}
public void setDescription_it(String description_it) {
this.description_it = description_it;
}
public String getDescription_en() { return description_en; }
public void setDescription_en(String description_en) { this.description_en = description_en; }
}
あなたのマッピングではまだ言語がオブジェクトのようですが、それはあなたのjsonの文字列として表示されます。 – TheBakker
両方のエンティティのIDをLongに変更しようとしましたか? Springデータをサポートするために、 'long'型のidが必要であるとします。 [リンク](https://examples.javacodegeeks.com/enterprise-java/spring/spring-data-rest-example/) –
@ TheBakker私の知る限り、リンクを使用すると、うまくいくはずです。 JSONで完全なオブジェクトを実装することは、この特定の状況では非常に非実用的です。 –