【问题标题】:OpenApi schema for JsonIdentityReference-normalized JPA EntitiesJsonIdentityReference 规范化 JPA 实体的 OpenApi 模式
【发布时间】:2021-12-06 02:06:51
【问题描述】:

使用@RestController、CrudRepository 和胶水@Services,我提供了对一些基于JPA 的对象的访问。

User 类引用List<Order>,而Order 引用User

为了打破杰克逊无限递归循环,我通过@JsonIdentityReference(alwaysAsId=true) 替换嵌套对象。但是,springdoc 似乎忽略了它,并且仍然生成指向 Order 而不是例如的 OpenApi Spec Long(id 类)。

如何告诉 springdoc 将 User.orders 映射到 List<Long> 或(甚至更好)映射到 List<OrderId>


@RestController
public class UsersController {

    @ApiResponses(value = {
        @ApiResponse(responseCode = "200", description = "successful operation", content = @Content(array = @ArraySchema(schema = @Schema(implementation = User.class))))
    })
    @GetMapping("/")
    public ResponseEntity<Iterable<User>> listUsers() {
        return ResponseEntity.ok(users.findAll());
    }

    // getters and setters omitted

}

@Entity
@JsonIdentityInfo(generator = ObjectIdGenerators.PropertyGenerator.class, property = "id")
public class User {

    @Schema(description = "The id of the user", required = true)
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;

    @OneToMany(mappedBy = "order")
    @JsonIdentityReference(alwaysAsId=true)
    private List<Order> orders = Collections.emptyList();

    // getters and setters omitted
}


@Entity
@JsonIdentityInfo(generator = ObjectIdGenerators.PropertyGenerator.class, property = "id")
public class Order {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "id", nullable = false)
    @Schema(required = true)
    private Long id;

    @ManyToOne
    @JoinColumn(name = "user_id")
    @JsonIdentityReference(alwaysAsId=true)
    private User user;

    @OneToMany(mappedBy = "order")
    @JsonIdentityReference(alwaysAsId=true)
    private List<Product> products = Collections.emptyList();

    // getters and setters omitted

}

【问题讨论】:

    标签: spring-boot spring-data-jpa jackson openapi springdoc


    【解决方案1】:

    简单的解决方案(破坏语义):将@ArraySchema 添加到这样的定义中:

        @OneToMany(mappedBy = "order")
        @JsonIdentityReference(alwaysAsId=true)
        @ArraySchema(schema = @Schema(implementation = Long.class))
        private List<Order> orders = Collections.emptyList();
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-10-10
      • 2017-07-20
      • 1970-01-01
      • 1970-01-01
      • 2023-01-31
      • 2016-12-14
      • 1970-01-01
      • 2018-11-01
      相关资源
      最近更新 更多