2017-04-11 19 views
1

私は、次の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を更新しました。 enter image description here

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; } 
} 
+1

あなたのマッピングではまだ言語がオブジェクトのようですが、それはあなたのjsonの文字列として表示されます。 – TheBakker

+0

両方のエンティティのIDをLongに変更しようとしましたか? Springデータをサポートするために、 'long'型のidが必要であるとします。 [リンク](https://examples.javacodegeeks.com/enterprise-java/spring/spring-data-rest-example/) –

+0

@ TheBakker私の知る限り、リンクを使用すると、うまくいくはずです。 JSONで完全なオブジェクトを実装することは、この特定の状況では非常に非実用的です。 –

答えて

1

あなたのJSONの構造は、あなたのJavaマッピングと一致している必要があり、そうでなければ、あなたのオブジェクトはなぜそれがだ、あなたのORMで永続化されることはありませんそのようなマッピングエラーが発生しています。あなたのエンティティで、あなたのケースで

あなたはJSONでobject sでなければならない2つのエンティティとの関係があります。

@OneToOne 
private Languages languages; 

@OneToOne 
private LangProficiency langProficiency; 

しかし、あなたのJSONでは、あなたは、単純な文字列としてこれら2つのオブジェクトを設定しています

languages: "http://localhost:9000/api/languages/de" 
proficiency_code: "http://localhost:9000/api/langproficiency/C1" 

彼らはLanguageslangProficiencyオブジェクトに一致しなければならない、とproficiency_codeは、Java属性のように、それぞれlangProficiency名前を付ける必要があります。

+0

あなたの答えをありがとう。 私は、削除されたURLを使用してgetリクエストによって取得する実際のオブジェクトでString値を置き換えることで、ソリューションを試しました。(そして私もプロパティの名前を変更しました) 私はまだ悲しいことに同じエラーが発生します。 –

+0

変更した内容で質問を編集できますか? –

+0

新しいJSONとその中のオブジェクトの登録を完了しました。 –

関連する問題