【问题标题】:Spring Boot Rest API Returns Empty JSON Used with LombokSpring Boot Rest API 返回与 Lombok 一起使用的空 JSON
【发布时间】:2020-09-21 21:31:10
【问题描述】:

我有带有 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 添加到实体,它可以正常工作。如何在不添加 getter setter 的情况下获取实际值作为响应,因为我正在使用 @Data 注释

【问题讨论】:

  • 您不需要同时使用 Getter 和 Data,Data 已经设置了您的 getter。实体也应该与 Table(name = "table_name" ) 注释一起使用。
  • 您根本不应该在 JPA 类型上使用 @Data,因为需要正确处理“toString”、“equals”和“hashCode”。详情请看我的回答stackoverflow.com/a/34299054/1331935。

标签: java spring-boot rest lombok spring-rest


【解决方案1】:

首先,在 spring 中,直接从控制器返回实体对象以转换为 json 并不是一个好方法。使用 DTO 方法,以便您始终拥有从控制器端点返回的 DTO 对象。这样,您将可以更好地控制要从端点返回的数据的类型和结构。

阅读here 了解使用 DTO 的优势。

其次,验证您的表是否遵循基本的spring jpa 命名约定或与实体类名称相同,如果不是,请添加@Table(name="") 注释以指定表名。检查数据是否已填充到您的实体类中。

移除@Data注解。

@Data 不应在 JPA 实体上使用,因为实体 toString、equals 和 hashCode 方法需要以非常具体的方式编写。详情请见here。

【讨论】:

  • 感谢您的回答,它帮助我理解了标准实现。
  • 实体是否从数据库中检索数据?从控制器返回时,您的实体类是否有任何数据?你能分享你的代码吗?
  • 如果我添加 getter 和 setter 就可以了。我在添加那些我得到所需输出后检查。
  • 您根本不应该在 JPA 类型上使用 @Data,因为需要正确处理“toString”、“equals”和“hashCode”。详情请看我的回答stackoverflow.com/a/34299054/1331935。我会更新这个答案。
【解决方案2】:

经过大量搜索并查看我的问题的答案后找到了解决方案。 如果我使用 cmd 中的 java -jar 运行我的 Spring Boot 应用程序,它可以正常工作。但不是 IDE,所以问题出在 IDE 配置上。

我正在使用 Eclipse IDE

右键单击您的项目 -> 属性

然后从属性窗口

Java 编译器 -> 注解处理 -> 启用注解处理

应选中此选项,然后处理注释。我从 Tinku 对这个问题的回答中关注了https://www.baeldung.com/lombok-ide。

【讨论】:

    【解决方案3】:

    需要在maven或gradle文件链接How to configure Lombok with maven-compiler-plugin?中添加Lombok插件。 如果您使用的是 IDE 则需要安装 Lombok 插件链接https://www.baeldung.com/lombok-ide

    【讨论】:

      【解决方案4】:

      如果您使用 Eclipse,请检查是否安装了 Lombok:

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-06-27
        • 2017-03-21
        • 2020-11-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-05-16
        • 1970-01-01
        相关资源
        最近更新 更多