例如我有一个豆
public class Order
{
int orderID;
String name;
}
我有一个POST操作
@ApiOperation(value = "Insert a new order", response = Order.class)
@RequestMapping(value = "/addOrder", method = RequestMethod.POST)
@ResponseStatus(HttpStatus.CREATED)
@ResponseBody
public Order addOrder(@Valid @RequestBody Order order)
{
//Set random id here
order.id = 'xxxxx';
Order o = orderService.insertOrder(order);
return o;
}
在Swagger中我有以下内容:
所以我的问题是,如何在POST上隐藏id但在GET上显示ID? 或者我应该添加说明,即使您选择添加ID,它也不会做任何事情而只返回我的随机ID?就像在Kubernetes (uid)
中一样@ApiModelProperty中的只读属性会解决所有问题吗?
答案 0 :(得分:4)
一种简单的方法是将bean分成两部分 - 一部用于创建一个新对象,另一部分用于扩展现有对象的数据。
e.g。
public class IncompleteOrder {
String name;
}
public class ExistingOrder extends IncompleteOrder {
int id;
}
然后让你的POST方法获取IncompleteOrder的对象并返回一个ExistingOrder。我还委托将随机订单ID分配给底层服务......
public ExistingOrder addOrder(@Valid @RequestBody IncompleteOrder order) {
ExistingOrder o = orderService.insertOrder(order);
return o;
}
同样的事情可以通过两个完全独立的类没有继承关系来实现,如果从现有订单上的信息创建新订单所需的信息之间存在显着差异,这可能是合适的。
另一种方法是询问id实际上是什么 - 为什么你的客户获得整数id?理想情况下,如果他们想要有关订单的任何信息,他们应该查询资源的API,并且要做到这一点,他们需要订单的URI而不是整数id。因此,沟通关于订单的外部服务应该是来回传递URI而不是ID。也许您可以鼓励您的客户通过您在POST请求的Location标头中返回的URI与每个客户进行通信?然后你可以放弃在你的响应中公开id并拥有一个纯粹对称的请求/响应体。