Spring 引导架 API Returns 空 JSON 与 Lombok 一起使用
Spring Boot Rest API Returns Empty JSON Used with Lombok
我有 Spring 具有 Web、JPA、H2、Web、Lombok 依赖项的启动应用程序。
我有如下实体
@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;
}
我正在关注 JSON 休息 /books REST 端点
[
{},
{}
]
如果我向实体添加 getter 和 setter,它就可以正常工作。我如何在不添加 getters setter 的情况下获取实际值作为响应,因为我正在使用 @Data 注释
需要在 maven 或 gradle 文件 link 中添加 Lombok 插件。
如果您使用 IDE 则需要安装 Lombok 插件 link https://www.baeldung.com/lombok-ide
首先,在spring中,将实体对象return直接从控制器转换为json并不是一个好的方法。使用 DTO 方法,这样您将始终拥有从控制器端点编辑的 DTO 对象 return。这样您就可以更好地控制要从端点返回的数据的类型和结构。
阅读 here 使用 DTO 的优势。
其次,验证您的 table 是否遵循基本的 spring jpa
命名约定或与实体 class 名称相同,如果不相同,请添加 @Table(name="")
注释指定 table 名称。检查数据是否正在填充到您的实体 classes.
删除 @Data
注释。
@Data
不应在 JPA 实体上使用,因为实体 toString
、equals
和 hashCode
方法需要以非常具体的方式编写。有关详细信息,请参阅 。
经过大量搜索并查看我的问题的答案后找到了解决方案。
如果我 运行 我的 spring 从 cmd 使用 java -jar 启动应用程序它工作正常。但 IDE 没有,所以问题出在 IDE 配置上。
我正在使用 Eclipse IDE
右键单击您的项目 -> 属性
然后从属性 window
Java 编译器 -> 注释处理 -> 启用注释处理
应选中此选项,然后处理注释。我遵循了 https://www.baeldung.com/lombok-ide Tinku 对这个问题的回答。
如果您使用的是 Eclipse,请检查是否安装了 Lombok:
我有 Spring 具有 Web、JPA、H2、Web、Lombok 依赖项的启动应用程序。 我有如下实体
@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;
}
我正在关注 JSON 休息 /books REST 端点
[
{},
{}
]
如果我向实体添加 getter 和 setter,它就可以正常工作。我如何在不添加 getters setter 的情况下获取实际值作为响应,因为我正在使用 @Data 注释
需要在 maven 或 gradle 文件 link
首先,在spring中,将实体对象return直接从控制器转换为json并不是一个好的方法。使用 DTO 方法,这样您将始终拥有从控制器端点编辑的 DTO 对象 return。这样您就可以更好地控制要从端点返回的数据的类型和结构。
阅读 here 使用 DTO 的优势。
其次,验证您的 table 是否遵循基本的 spring jpa
命名约定或与实体 class 名称相同,如果不相同,请添加 @Table(name="")
注释指定 table 名称。检查数据是否正在填充到您的实体 classes.
删除 @Data
注释。
@Data
不应在 JPA 实体上使用,因为实体 toString
、equals
和 hashCode
方法需要以非常具体的方式编写。有关详细信息,请参阅
经过大量搜索并查看我的问题的答案后找到了解决方案。 如果我 运行 我的 spring 从 cmd 使用 java -jar 启动应用程序它工作正常。但 IDE 没有,所以问题出在 IDE 配置上。
我正在使用 Eclipse IDE
右键单击您的项目 -> 属性
然后从属性 window
Java 编译器 -> 注释处理 -> 启用注释处理
应选中此选项,然后处理注释。我遵循了 https://www.baeldung.com/lombok-ide Tinku 对这个问题的回答。
如果您使用的是 Eclipse,请检查是否安装了 Lombok: