【问题标题】:HttpMessageNotWritableException - Could not write JSON in Join TablesHttpMessageNotWritableException - 无法在联接表中写入 JSON
【发布时间】:2020-11-24 10:08:51
【问题描述】:

我想根据它们的相对 ID 选择三个数据库。

您有一个名为 sms_templates 的主表:

CREATE TABLE public.sms_templates
(
    id integer NOT NULL DEFAULT nextval('sms_templates_id_seq'::regclass),
    name character varying(150) COLLATE pg_catalog."default" NOT NULL,
    has_variables boolean NOT NULL DEFAULT false,
    default_label text COLLATE pg_catalog."default" NOT NULL,
    created_at timestamp without time zone NOT NULL DEFAULT now(),
    updated_at timestamp without time zone NOT NULL DEFAULT now(),
    CONSTRAINT sms_templates_pkey PRIMARY KEY (id)
)

短信模板语言:

CREATE TABLE public.sms_template_languages
(
    id integer NOT NULL DEFAULT nextval('sms_template_languages_id_seq'::regclass),
    sms_template_id integer NOT NULL,
    language_id integer NOT NULL,
    label text COLLATE pg_catalog."default" NOT NULL,
    created_at timestamp without time zone NOT NULL DEFAULT now(),
    updated_at timestamp without time zone NOT NULL DEFAULT now(),
    CONSTRAINT sms_template_languages_pkey PRIMARY KEY (id),
    CONSTRAINT sms_template_languages_language_id_fkey FOREIGN KEY (language_id)
        REFERENCES public.languages (id) MATCH SIMPLE
        ON UPDATE NO ACTION
        ON DELETE CASCADE,
    CONSTRAINT sms_template_languages_sms_template_id_fkey FOREIGN KEY (sms_template_id)
        REFERENCES public.sms_templates (id) MATCH SIMPLE
        ON UPDATE NO ACTION
        ON DELETE CASCADE
)

最后是语言表:

CREATE TABLE public.languages
(
    id integer NOT NULL DEFAULT nextval('languages_id_seq'::regclass),
    name character varying(5) COLLATE pg_catalog."default" NOT NULL,
    created_at timestamp without time zone NOT NULL DEFAULT now(),
    updated_at timestamp without time zone NOT NULL DEFAULT now(),
    CONSTRAINT languages_pkey PRIMARY KEY (id)
)

我已经创建了它们单独的实体/存储库,当我将 sms_templates 表与 sms_template_languages 连接时,一切正常。但是,一旦我加入语言表以便获得值,一切都开始崩溃,最终出现以下错误:

[org.springframework.http.converter.HttpMessageNotWritableException: Could not write JSON: Could not set field value [LanguageEntity(id=2, code=null, createdAt=null, updatedAt=null)] value by reflection : [class com.packagename.SMSTemplateLanguage.Entity.SMSTemplateLanguageEntity.languageEntitySet] setter of com.packagename.SMSTemplateLanguage.Entity.SMSTemplateLanguageEntity.languageEntitySet;

我的实体:

@Entity
@Table(name = "sms_templates")
@Data
public class SMSTemplateEntity {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    @Column
    private String name;
    @Column(name="has_variables")
    private Boolean hasVariables;
    @Column(name = "default_label")
    private String defaultLabel;
    @Column(name = "created_at")
    private Timestamp createdAt;
    @Column(name = "updated_at")
    private Timestamp updatedAt;
    @OneToMany(targetEntity = SMSTemplateVariableEntity.class)
    @JoinColumn(name = "sms_template_id")
    private Set<SMSTemplateVariables> variableNames;
    @OneToMany(targetEntity = SMSTemplateLanguageEntity.class)
    @JoinColumn(name = "sms_template_id")
    private Set<SMSTemplateLanguageEntity> templateLanguage;

    @PrePersist
    public void prePersist() {
        this.createdAt = new Timestamp((System.currentTimeMillis()));
        this.updatedAt = new Timestamp((System.currentTimeMillis()));
    }

    @PreUpdate
    public void preUpdate() {
        this.updatedAt = new Timestamp((System.currentTimeMillis()));
    }

}


@Entity
@Table(name = "sms_template_variables")
@Data
public class SMSTemplateVariableEntity {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    @Column(name = "sms_template_id")
    private Long smsTemplateId;
    @Column(name = "variable_name")
    private String variableName;
    @Column(name = "created_at")
    @JsonIgnore
    private Timestamp createdAt;
    @JsonIgnore
    @Column(name = "updated_at")
    private Timestamp updatedAt;

    @PrePersist
    public void prePersist() {
        this.createdAt = new Timestamp((System.currentTimeMillis()));
        this.updatedAt = new Timestamp((System.currentTimeMillis()));
    }

    @PreUpdate
    public void preUpdate() {
        this.updatedAt = new Timestamp((System.currentTimeMillis()));
    }
}

@Entity
@Data
@Table(name = "sms_template_languages")
public class SMSTemplateLanguageEntity {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    @Column(name = "sms_template_id")
    private Long smsTemplateId;
    @Column
    private String label;
    @Column(name = "created_at")
    @JsonIgnore
    private Timestamp createdAt;
    @Column(name = "updated_at")
    @JsonIgnore
    private Timestamp updatedAt;
    @OneToOne(targetEntity = LanguageEntity.class)
    @JoinColumn(name = "language_id")
    private Set<LanguageEntity> languageEntitySet;

    @PrePersist
    public void prePersist() {
        this.createdAt = new Timestamp((System.currentTimeMillis()));
        this.updatedAt = new Timestamp((System.currentTimeMillis()));
    }

    @PreUpdate
    public void preUpdate() {
        this.updatedAt = new Timestamp((System.currentTimeMillis()));
    }
}

@Data
@Entity
@Table(name = "languages")
public class LanguageEntity {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    @Column(name = "name")
    private String code;
    @Column(name = "created_at")
    @JsonIgnore
    private Timestamp createdAt;
    @JsonIgnore
    @Column(name = "updated_at")
    private Timestamp updatedAt;

    @PrePersist
    public void prePersist() {
        this.createdAt = new Timestamp((System.currentTimeMillis()));
        this.updatedAt = new Timestamp((System.currentTimeMillis()));
    }

    @PreUpdate
    public void preUpdate() {
        this.updatedAt = new Timestamp((System.currentTimeMillis()));
    }
}

我的主要仓库:

@Repository
public interface SMSTemplateRepository extends CrudRepository<SMSTemplateEntity, Long> {
    @Query(value = "SELECT new com.montymobile.parentalControlPortal.SMSTemplate.DTOs.SMSTemplateDTO " +
            "(st) FROM SMSTemplateEntity st")
    List<SMSTemplateDTO> getTemplates();
}

负责的 DTO:

@Data
public class SMSTemplateDTO {
    private Long id;
    private String name;
    private Set<SMSTemplateVariables> variableNames;
    private Set<SMSTemplateLanguageEntity> languageEntities;

    public SMSTemplateDTO() {
    }

    public SMSTemplateDTO(SMSTemplateEntity smsTemplateEntity) {
        this.id = smsTemplateEntity.getId();
        this.name = smsTemplateEntity.getName();
        this.variableNames = smsTemplateEntity.getVariableNames();
        this.languageEntities = smsTemplateEntity.getTemplateLanguage();
    }
}

是我混淆了关系还是我的 Java 代码中遗漏了某个部分?

【问题讨论】:

    标签: java postgresql spring-boot


    【解决方案1】:

    在 application.properties n 检查中添加以下内容:---(有多种方法可以修复它,我正在写下其中之一)

    spring.jackson.serialization.FAIL_ON_EMPTY_BEANS=false
    

    添加依赖:---

    <!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-databind -->
    <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-databind</artifactId>
        <version>2.11.2</version>
    </dependency>
    

    【讨论】:

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