java - Spring Boot Rest API 返回与 Lombok 一起使用的空 JSON
问题描述
我有带有 Web、JPA、H2、Web、Lombok 依赖项的 Spring Boot 应用程序。我有以下实体
@NoArgsConstructor
@AllArgsConstructor
@Data
@Entity
@Getter
public class Book {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(nullable = false)
private String name;
@Column(nullable = false)
private Integer pageCount;
@ManyToOne
@JoinColumn(name = "author_id")
private Author author;
}
@NoArgsConstructor
@AllArgsConstructor
@Data
@Entity
@Getter
public class Author {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(nullable = false)
private String firstName;
@Column
private String lastName;
}
我正在为 /books REST 端点获取以下 JSON 信息
[
{},
{}
]
如果我将 getter 和 setter 添加到实体,它工作正常。当我使用@Data注释时,如何在不添加getter setter的情况下获得实际值作为响应
解决方案
首先,在 spring 中,直接从控制器返回实体对象以转换为 json 并不是一个好方法。使用 DTO 方法,以便您始终拥有从控制器端点返回的 DTO 对象。这样,您将可以更好地控制要从端点返回的数据的类型和结构。
阅读此处了解使用 DTO 的优势。
其次,验证您的表是否遵循基本spring jpa
命名约定或与实体类名称相同,如果不是,请添加@Table(name="")
注释以指定表名。检查数据是否填充到您的实体类中。
删除@Data
注释。
@Data
不应在 JPA 实体上使用 Entity toString
, equals
, 和hashCode
方法需要以非常具体的方式创作。有关详细信息,请参见此处。
推荐阅读
- firebase - 如何在 Google 登录时显示我们的自定义域?
- flutter - Flutter Dismissible 小部件,带有 confirmDismiss 和 showAlertDialog 停止应用程序
- visual-studio-code - 完成时如何将光标放在自定义位置?
- javascript - 使用 asyncStorage 对日常日志和图表做出本机反应
- python - 将字母序列传递给 CNN - Keras
- nginx - 使用 nginx 将子子域代理到 ip
- jquery - 使用 JQuery 替换 div 中的内容
- jquery - 在 jQuery 的表单中查找 UL 和 LI 中复选框的输入选择器
- php - 如何从 curl 请求中删除谷歌验证码?
- cmake - 如何在 cmake 中设置 rpath 原点?