在spring boot中处理复杂的端点

时间:2015-07-31 15:00:22

标签: rest spring-boot

我有一个复杂的端点,我需要在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)
    }
}

2 个答案:

答案 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端点进行硬编码。