2017-04-11 103 views
1

应坚持一对多的关系我有一个叫jobprofile类,它包含以下一对多关系:在Spring数据休息

@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; 
    } 
} 

基本上,它只包含两种对一种语言的引用,以及对它的熟练程度。

当我尝试创建/保留作业配置文件时,只要尝试将语言数据插入到数据库中,就会失败。

这是错误:

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"])

我怀疑错误的根源在于JSON,因为一对多关系完美的作品,当我手动插入数据。

的JSON的相关部分看起来是这样的:

job_language_proficiency: Array[1] 
    0: Object 
     languages: "http://localhost:9000/api/languages/de" 
     proficiency_code: "http://localhost:9000/api/langproficiency/C1" 

任何想法,为什么这不起作用?

编辑:更新了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。假设你需要一个'long'类型的id来支持Spring数据。 [链接](https://examples.javacodegeeks.com/enterprise-java/spring/spring-data-rest-example/) –

+0

@TheBakker据我所知,使用链接也应该工作。在JSON中实现完整的对象对于这种特定的情况是非常不切实际的。 –

回答

1

你的JSON结构应该符合你的Java映射,否则你的对象不会被你的ORM持久化,这就是为什么你正在得到这样的映射错误。

在你的实体的情况下,你有两个实体,应该是object在你的JSON的关系:

@OneToOne 
private Languages languages; 

@OneToOne 
private LangProficiency langProficiency; 

但在你的JSON,您已设置这两个对象作为简单的字符串:

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

他们应该匹配LanguageslangProficiency对象,proficiency_code应分别命名为langProficiency喜欢你的Java属性。

+0

感谢您的回答。 我尝试了你的解决方案,将字符串值替换为通过使用删除的URL获取请求来检索的实际对象。(而且我也重命名了这个属性) 我仍然很伤心地得到同样的错误。 –

+0

你能修改你的问题吗? –

+0

完成后,添加新的JSON并在其中包含对象 –

相关问题