java - 您将如何使用 Spring Boot 处理仅具有可选查询参数的 REST API?
问题描述
我想构建一个简单的端点,它返回一个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 Optional 并使用@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;
}
然后在您的控制器方法中接收此类的实例:
@GetMapping(path = "/order/items", produces = "application/json")
public ResponseEntity<OrderInfo> getOrder(SearchOrderCriteria searchCriteria) {
OrderInfo order = orderService.findOrder(searchCriteria)
return ResponseEntity.ok(order);
}
而且,在您的服务中,为了避免一堆if
- else
,您可以使用示例查询:
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);
}
推荐阅读
- python-3.x - Macbook 上的 Streamlit
- php - XML RPC API 错误代码:2945 消息 INVALID_TICKET
- apache-spark - 如何在集群中使用“可撤销资源”(Spark + Mesos)
- python-3.x - 使用 python3.8、twisted 20.3.0、OpenSSL 1.1.1g 面临 SSL 的内存泄漏
- jquery - 如何在 jquery 事件中调用 vue 方法?
- sql-server - 在同一个表中插入 2 行的比率
- angular - 注销 MatDialog 在移动浏览器中不起作用
- java - ANTLR4:Java - TokenStreamRewriter getText() 方法的性能问题
- mark.js - Mark.js 突出显示包含在 html 标记中的文本
- apache - 如何在 Plack/Apache 中拦截回复