1

您好,我实际上正在使用 Spring-boot、hibernate、psql 在 REST 服务器上工作,在实体之间添加 OneToOne 关系后我遇到了一些困难。

以下是 2 个实体:

支付:

@Entity
@Table(name = "pays")
public class Pays implements Serializable {

private static final long serialVersionUID = 1L;

@Id
@JsonProperty("codePays")
private String codePays;

@Column(name = "libelle_pays")
@JsonProperty("libellePays")
private String libellePays;

@OneToOne(mappedBy = "pays",cascade = CascadeType.ALL, fetch = FetchType.LAZY, optional=false)
private Traduction traduction;

protected Pays() {
}

public Pays(String codePays,String libellePays) {
    this.codePays = codePays;
    this.libellePays = libellePays;
}

和翻译:

@Entity
@Table(name = "traduction")
public class Traduction implements Serializable {

private static final long serialVersionUID = 1L;

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@JsonProperty("codeTrad")
private long codeTrad;

@Column(name = "defaultLanguage")
@JsonProperty("defaultLanguage")
private boolean defaultLanguage;

@OneToOne(cascade = CascadeType.ALL,fetch = FetchType.LAZY)
@JoinColumn(name="fk_code_pays")
@JsonProperty("codePays")
private Pays pays;

public Traduction(){
}

public Traduction(String codePays,boolean defaultLanguage) {
    this.defaultLanguage = defaultLanguage;
    pays.setCodePays(codePays);
}

当我尝试使用 Post 方法填充我的表格转导时,我的问题发生了:

@PostMapping("/traduction")
public Traduction createTraduction(@RequestBody Traduction trad) {
    System.err.println(trad);
    return repository.save(trad);
}

当我像这样通过 PostMan 将 JSON 数据发送到我的服务器时:

{ "codeTrad":0, "defaultLanguage":true, "fk_code_pays":"FR" }

或者这样:

{ "codeTrad":0, "defaultLanguage":true, "pays": { "codePays":"FR", "libellePays":"France" } }

我的服务器似乎不理解与对象 Pays 的映射。这是我请求后对象 Traduction 的样子:[codeTrad=0, null, defaultLanguage=true]

和漂亮的错误:

已解决 [org.springframework.http.converter.HttpMessageNotWritableException: 无法写入 JSON: (was java.lang.NullPointerException); 嵌套异常是 com.fasterxml.jackson.databind.JsonMappingException: (was java.lang.NullPointerException) (通过引用链:com.auchan.corp.ipon.iponporttail.model.Traduction["codePays"])]

所以我想知道问题是来自我的服务器概念还是我的 JSON。你有想法吗?

4

2 回答 2

1

您的问题来自:

public Traduction(String codePays, boolean defaultLanguage) {
        this.defaultLanguage = defaultLanguage;
        pays.setCodePays(codePays)

pays 为 null,这就是为什么你得到一个异常 : java.lang.NullPointerException,尝试将 Pays pays 添加到该构造函数。

于 2018-12-18T16:25:56.983 回答
0

这个 json 不起作用:

{ "codeTrad":0, "defaultLanguage":true, "fk_code_pays":"FR" }

fk_code_pays因为您的Traduction班级中没有字段名称。

下面也不起作用:

{ "codeTrad":0, "defaultLanguage":true, "pays": { "codePays":"FR", "libellePays":"France" } }

因为 pays 用@JsonProperty("codePays")

根据您的 DTO 类,您的 json 应该是:

{ "codeTrad":0, "defaultLanguage":true, "codePays": { "codePays":"FR", "libellePays":"France" } }

另外,我建议您使用包装类代替原语。Boolean代替booleanLong代替long

于 2018-12-18T17:37:20.027 回答