在 RequestBody 中隐藏 POST 上的 ID,但创建 return 上的 ID

Hide ID on POST in RequestBody, but return ID on created

比如我有一个bean

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,它也不会做任何事情,只是 return 我的随机 ID?就像 Kubernetes (uid)

@ApiModelProperty 中的只读属性可以解决任何问题吗?

一种简单的方法是将您的 bean 分成两部分 - 一个用于创建新的 object,另一个用于扩展现有 object.

的数据。

例如

public class IncompleteOrder {
    String name;
}

public class ExistingOrder extends IncompleteOrder {
    int id;
}

然后让您的 POST 方法采用 object IncompleteOrder 和 return ExistingOrder 之一。我还将委派为基础服务分配随机订单 ID 的责任...

public ExistingOrder addOrder(@Valid @RequestBody IncompleteOrder order) {
        ExistingOrder o = orderService.insertOrder(order);        
        return o;
 }

同样的事情可以通过两个完全独立的 类 而没有继承关系来实现,如果创建新订单所需的信息与创建新订单所需的信息之间存在重大差异,这可能是合适的在现有订单上。

另一种方法是询问该 ID 的实际用途 - 为什么您的客户得到的是整数 ID?理想情况下,如果他们想要有关订单的任何信息,他们应该查询 API 资源,为此他们需要订单的 URI 而不是整数 ID。因此外部服务通信 关于 订单应该来回传递 URI 而不是 id。也许您可以鼓励您的客户通过您 return 在 POST 请求的位置 header 中的 URI 与每个人进行通信?然后你可以取消在你的响应中暴露 id 并有一个纯粹的对称请求/响应 body.