在RequestBody中隐藏POST上的ID,但在创建时返回ID

时间:2016-12-30 14:56:23

标签: java spring rest swagger springfox

例如我有一个豆

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中我有以下内容:

swagger_img

所以我的问题是,如何在POST上隐藏id但在GET上显示ID? 或者我应该添加说明,即使您选择添加ID,它也不会做任何事情而只返回我的随机ID?就像在Kubernetes (uid)

中一样

@ApiModelProperty中的只读属性会解决所有问题吗?

1 个答案:

答案 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并拥有一个纯粹对称的请求/响应体。