【问题标题】:Could not write JSON: Unable to find com.demo.model.Control with id 0;无法写入 JSON:无法找到 id 为 0 的 com.demo.model.Control;
【发布时间】:2019-09-29 16:42:49
【问题描述】:

我花了一整天的时间来解决这个问题,但是我仍然没有得到它的原因,因为我的 projet 和 controle 表不是空的,为什么 JPA 寻找一个 id=0 的 Controle?:

WARN 5764 --- [nio-8080-exec-4] .w.s.m.s.DefaultHandlerExceptionResolver:已解决 [org.springframework.http.converter.HttpMessageNotWritableException:无法写入 JSON:无法找到 com.demo.model.Controle 的 ID 0;嵌套异常是 com.fasterxml.jackson.databind.JsonMappingException: Unable to find com.demo.model.Controle with id 0 (通过引用链: java.util.ArrayList[0]->com.demo.model.Projet[" Controle"]->com.demo.model.Control$HibernateProxy$aqtpKvMx["nomControle"])]

这是我的两个模型:

项目实体:

@Entity
@Table(name="projets")
public class Projet implements Serializable{
//other properties
//.....
    @ManyToOne(fetch = FetchType.LAZY, optional = false)
    @JsonIgnoreProperties({"hibernateLazyInitializer", "handler"})
    @JoinColumn(name="id_controle")
    private Controle controle;
//....
//other getters and sitters
    public Controle getControle() {
        return Controle;
    }

    public void setControle(Controle controle) {
        this.Controle = controle;
    }
}

** 控制实体:**

@Entity
@Table(name="controle")
public class Controle implements Serializable{

    private static final long serialVersionUID = -7906212173191059200L;

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name="id_controle", nullable=false)
    private int  idControle;

    @Column(name="nom_controle", nullable = true)
    private String nomControle;

    @Column(name="tel_controle", nullable = true)
    private String telControle;

    @Column(name="email_controle", nullable = true)
    private String emailControle;

    @Column(name="address_controle", nullable = true)
    private String addressControle;

    protected Controle() {
    }

    public Controle(String nom, String tel, String email, String address) {
        super();
        this.nomControle = nom;
        this.telControle = tel;
        this.emailControle= email;
        this.addressControle = address;
    }

//other getters and sitters
public String getNomControle() {
        return nomControle;
    }

    public void setNomControle(String nomControle) {
        this.nomControle = nomControle;
    }

当我尝试通过JpaRepositorygetAllProjet() 方法获取所有项目时出现此错误。

ProjetController:这个方法以前有效,现在它触发了错误:

@GetMapping("/projets")
    public List<Projet> getAllProjet(){
        List<Projet> p = projetRepository.findAll();
        Collections.reverse(p);
        return p;
    }

我也在客户端收到此错误:

HttpErrorResponse {headers: HttpHeaders, status: 500, statusText: "OK", url: "http://localhost:8080/api/v1/projets", ok: false, ...}

提前谢谢你。

【问题讨论】:

  • 该列表包含一个 Projet,它应该与 ID 为 0 的 Controle 相关联,但该 controle 不存在。因此,您在数据库中的数据似乎处于不连贯的状态(应该有一个外键约束,使项目无法引用不存在的 Controle)。请注意,您发布的代码无法编译...
  • @JBNizet 好吧,我在 Projet 和 Controle 之间有外键关系......在一切正常之前,这就是为什么我不明白原因。请解释一下为什么这段代码无法编译?谢谢
  • 因为一个名为 BureauxControle 的类有一个名为 Controle 的构造函数,因为你使用 Controle 等引用了一个名为 controle 的变量。
  • 是的,你说得对,这只是一个错误,我会纠正它
  • 很可能是因为,正如消息和我的评论所说,其中一个项目引用了 ID 为 0 的控件,即 projet 表的其中一行具有值为 0 的 id_controle。

标签: java spring hibernate spring-boot spring-data-jpa


【解决方案1】:

这个问题的根源是在我的表 "projet" 中添加了一个新列 "controle",并带有一个指向 "controle" 表的外键。因此,该列的行的值为空。

克服困难

"HttpMessageNotWritableException" 问题 - 当我尝试显示空值时 -

甚至是

"HttpMessageNotReadableException" 问题 - 当我尝试在外键中添加具有空值的新对象时 -

我在验证插入值的前端部分添加了这个条件:

if (this.projetForm.controls.controle.value === '') {
      formValue['controle']=null;
    }

这个技术帮助我解决了这个问题,我希望这个解决方案能帮助遇到同样错误的人。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-29
    • 2020-05-13
    • 2021-02-19
    • 2019-09-02
    • 2019-05-15
    • 1970-01-01
    相关资源
    最近更新 更多