java - HttpMessageNotWritableException - 无法在联接表中写入 JSON
问题描述
我想根据它们的相对 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 代码中有没有遗漏的部分?
解决方案
在 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>
推荐阅读
- sql - 雪花多表插入使用不在目标表中的值的时间和子查询
- proxy - 在端口 80 上使用 Apache 2 的 Squid 代理
- vue.js - 有没有办法防止索引块被构建过程更新?
- c++ - 如何在while循环中使用条件变量进行互斥锁?
- python - Django-postgres-extesion ArrayRemove
- javascript - 如何在 Vue.js 中将删除请求延迟 1 秒
- spring - 如何根据服务器告诉spring boot要加载哪些属性文件?
- mysql - MYSQL 如何在特定索引页中找到键?
- c# - 尽管具有正确的 using 指令,但对象中的某些方法不可用
- terraform - 特定文件更改的触发管道