java - 如何使用 Spring Boot 处理仅包含可选查询参数的 REST API?

标签 java rest spring-boot spring-data-jpa software-design

我想构建一个返回 Order 对象的简单端点,我可以在其中通过单个查询参数或多个查询参数的组合来搜索该订单。所有这些查询参数都是可选的,原因是不同的人会根据不同的 Id 访问这些订单。

例如: /order/items?itemId={itemId}&orderId={orderId}&deliveryId={deliveryId}&packetId={packetId}

@GetMapping(path = "/order/items", produces = "application/json")
public Order getOrders(@RequestParam Optional<String> itemId,
                              @RequestParam Optional<String> orderId,
                              @RequestParam Optional<String> deliveryId,
                              @RequestParam Optional<String> packetId) { }

我当然也可以跳过Java可选并使用@RequestParam(required = false),但这里的问题是如何转义if-else或者 .isPresent() 检查查询参数是否为空的噩梦?或者是否有一种优雅的方法,根据参数的组合,进一步传递到我的服务和 Spring Data JPA 存储库。

最佳答案

为了最大限度地减少方法中的参数数量,您可以将查询参数定义为类的字段:

@Data
public class SearchOrderCriteria {
    private String itemId;
    private String orderId;
    private String deliveryId;
    private String packetId;
}

然后在 Controller 方法中接收此类的实例:

@GetMapping(path = "/order/items", produces = "application/json")
public ResponseEntity<OrderInfo> getOrder(SearchOrderCriteria searchCriteria) {
    OrderInfo order = orderService.findOrder(searchCriteria)
    return ResponseEntity.ok(order);
}

并且,在您的服务中,为了避免一堆 if-else,您可以使用 query by example :

public OrderInfo findOrder(SearchOrderCriteria searchCriteria) {

    OrderInfo order = new OrderInfo();
    order.setItemId(searchCriteria.getItemId());
    order.setOrderId(searchCriteria.getOrderId());
    order.setDeliveryId(searchCriteria.getDeliveryId());
    order.setPacketId(searchCriteria.getPacketId());

    Example<OrderInfo> example = Example.of(order);
    return orderRepository.findOne(example);
}

关于java - 如何使用 Spring Boot 处理仅包含可选查询参数的 REST API?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60323669/

相关文章:

java - 帮助将数组更改为 Java 中的单个变量

java - 当通过公共(public) API 测试很难看时,如何在 Java 中测试私有(private)方法?

java - JAX-RS HTTP 多部分请求

java - 如何将 Spring Cloud Stream Function Bean 连接到 Kafka Binder?

java - 将二维数组元素从一个复制到另一个

java - 有没有机器独立的编译器?

mysql - Node.js 安全

rest - Extjs 4.2 Proxy Rest id 参数

java - 在 spring boot 中加载上下文配置

java - Spring 集成测试消耗大量内存,在 GradleWorkerMain 中使用大量重复线程