首页 > 技术文章 > 【BUG】@JsonIgnore注解引发的java.sql.SQLException【已解决】

amigou 2022-01-22 08:26 原文

最近做了一个需求,页面上展示的字段要求尽可能的简介,但是实际插入到数据库的时候,会有很多ID,还有诸如创建人,创建时间,更新人,更新时间等字段。

而这些字段,前端要求不展示。

最后的页面效果如下:

在这里插入图片描述

于是我就用了@JsonIgnore注解进行开发。

后端的entity实体类是这样的:

package com.ruoyi.digital.domain;

import com.fasterxml.jackson.annotation.JsonIgnore;
import lombok.Data;

import java.io.Serializable;

/**
 * 设备清单对象 BU_Machine_BasicInfo
 */
@Data
public class BuMachineBasicinfo implements Serializable{

    private static final long serialVersionUID = 1L;

    /** 主键 */
    private Long macId;

    /** 设备编码 */
    private String macCode;

    private String macName;

    /** 设备类型ID */
    @JsonIgnore
    private Long mactId;

    /** 设备类型名称 */
    private String macTName;

    /** 所属公司名称 */
    private String companyName;

    /** 系统ID */
    @JsonIgnore
    private Long mosId;

    /** 系统名称 */
    private String mosName;

    /** 设备描述 */
    private String macDesc;

    /** 公司ID */
    @JsonIgnore
    private Long companyId;

    /** 设备描述 */
    private String wsName;

    /** 车间名 */
    private String cName;

    /** 车间Id */
    @JsonIgnore
    private Long CID;

    /** 是否为大机器 */
    @JsonIgnore
    private Long isBig;

    /** 添加人ID */
    @JsonIgnore
    private Long addUserId;

    /** IP地址 */
    private String macIP;

    /** 端口号 */
    private Long macPort;

    /** 创建时间 */
    @JsonIgnore
    private Long addTimestamp;

    /** 更新人ID */
    @JsonIgnore
    private Long lastUpdateUserId;

    /** 更新时间 */
    @JsonIgnore
    private Long lastUpdateTimestamp;

    /** 删除标记 */
    @JsonIgnore
    private Integer isDel;

    /** 删除人ID */
    @JsonIgnore
    private Long delUserid;

    /** 删除人时间 */
    @JsonIgnore
    private Long delTimestamp;
}

@JsonIgnore注解在返回参数时会忽略该字段,而不是直接返回null。

在这里插入图片描述
可以看到,返回的样式很简洁,基本上达到了要求。

但是,在添加页面的时候,突然报了一个错误:java.sql.SQLException

在这里插入图片描述
报错信息比较奇怪,说 MacT_ID没有默认值

如果是linux,你要下载linux的dll文件
可我明明传了MacT_ID,怎么会取不到呢。

我用debug模式测了一下,这个值竟然是null。

我想了想,有可能是@JsonIgnore注解导致的,百度了一下,果然是。

这个问题的解决方案还是很多的。

  1. set方法加上@JsonIgnore,表示返回时忽略,get方法加上@JsonProperty,表示请求时注入
  2. 在字段上添加@JsonProperty(access= JsonProperty.Access.WRITE_ONLY),表示只在写入时设置该值(读的时候不返回。)

@JsonProperty注解的access有四个,是AUTOREAD_ONLYWRITE_ONLYREAD_WRITE

  • READ_ONLY@JsonIgnore类似。
  • AUTO是默认策略,读写均设置值,相当于READ_WRITE

由于我用了lombok插件,在实体类没有写get和set方法,因此我用的是第二种方法。

推荐阅读