java 如何使用WebMvcLinkBuilder与存储库的findById?

66bbxpm5  于 2023-06-28  发布在  Java
关注(0)|答案(1)|浏览(131)

我正在尝试使用Spring Data Rest为大约60个实体实现一整套服务。现在,我只是让Spring使用我的存储库,而不是实现控制器,这很好!
我必须建模的数据并不理想--我更喜欢将customerId作为order对象的一部分。

{
  "tenantId": 42,
  "id": "00000001",
  "customer": {
    "tenantId": 42,
    "id": "CUST001",
    "name": "Arthur Dent"
  }
}

我将相关实体的ID作为JSON对象的属性。

public class Order {
  Long tenantId;
  String id;
  String customerId;
}

我并不真的想提取完整的Customer实体和所有其他相关实体并将它们作为Order对象的成员。相反,我只想添加一些_links集合的链接。
我相信我终于弄明白了WebMvcLinkBuilder,我有了基本的想法。但是,JpaRepository.findById返回java.util.Optional

@Bean
public RepresentationModelProcessor<EntityModel<Order>> orderProcessor() {
  return new RepresentationModelProcessor<EntityModel<Order>>() {
    @Override
    public EntityModel<Order> process(final EntityModel<Order> model) {
      final CustomerRepository controller = WebMvcLinkBuilder.methodOn(CustomerRepository);
      final CustomerId id = new CustomerId(model.getContent().getTenantId(), model.getContent().getCustomerId());
      model.add(WebMvcLinkBuilder.linkTo(controller.findById(id)).withRel("customer"));
      return model;
    }
  };
}

我得到的错误是:
无法生成java.util类的CGLIB子类。可选:此问题的常见原因包括使用final类或不可见类;嵌套异常为java. lang. IllegalArgumentException:不能子类化final类java.util.Optional
如何添加链接到我的资源?

arknldoa

arknldoa1#

我和你有同样的问题,我通过创建一个函数findByIdOrThrowError(Integer id)来解决它,该函数从Controller获取Customer,并检查是否没有结果来抛出.orElseThrow()错误。
然后调用linkTo()内部的函数。

相关问题