我有一个复杂的端点,我需要在Spring引导中为REST服务实现。它看起来像下面这样:
https://[server]:[port]/purchaseManager/api/v1/customers/{customerId}/purchaseOrders
此端点的POST将创建新的采购订单。 purchaseOrders
段必须始终以customers/{customerId}
段开头,但customers
段可能独立。
我如何编写两个相互交互的控制器来处理这个端点?由于两个控制器共享大部分相同的端点文本,是否有比下面的更好的实践?
客户
@RestController
@RequestMapping(value="/customers")
public class CustomerController {
@RequestMapping(method=RequestMethod.POST)
public Customer CreateCustomer (@RequestBody String name) {
return new Customer(name)
}
}
采购订单
@RestController
public class PurchaseOrderController {
@RequestMapping(value="/customers/{customerId}/purchaseOrders", method=RequestMethod.POST)
public PurchaseOrder CreatePO (@RequestBody String externalId) {
return new PurchaseOrder(externalId)
}
}
答案 0 :(得分:0)
您不需要在班级指定@RequestMapping。 只需在方法级别执行即可。
@RequestMapping(value="/customers/{customerId}/purchaseOrders", method=RequestMethod.POST)
public PurchaseOrder CreatePO (@RequestBody String externalId, @PathVariable String customerId) {
return new PurchaseOrder(externalId)
}
答案 1 :(得分:0)
到目前为止,我发现的最佳方法是创建一个带有静态字段的单独CustomerLinks类。这就是Oliver Gierke在spring-data-rest sample app中所做的:
@RequestMapping(value = PaymentLinks.PAYMENT, method = PUT)
这样的类在集成测试方面也很有帮助 - 你的测试中没有对所有api端点进行硬编码。