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

fec*_*eco 2 java rest spring swagger springfox

例如我有一个豆子

public class Order
{
    int orderID;
    String name;
}
Run Code Online (Sandbox Code Playgroud)

我有一个 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;
}
Run Code Online (Sandbox Code Playgroud)

在 Swagger 中,我有以下内容:

swagger_img

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

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

sis*_*hus 7

一种简单的方法是将 bean 一分为二——一个用于创建新对象,另一个用于扩展现有对象的数据。

例如

public class IncompleteOrder {
    String name;
}

public class ExistingOrder extends IncompleteOrder {
    int id;
}
Run Code Online (Sandbox Code Playgroud)

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

public ExistingOrder addOrder(@Valid @RequestBody IncompleteOrder order) {
        ExistingOrder o = orderService.insertOrder(order);        
        return o;
 }
Run Code Online (Sandbox Code Playgroud)

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

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