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

Java 在RequestBody中隐藏POST上的ID,但在创建时返回ID,java,spring,rest,swagger,springfox,Java,Spring,Rest,Swagger,Springfox,例如,我有一个豆子 public class Order { int orderID; String name; } 我做了一次手术 @ApiOperation(value = "Insert a new order", response = Order.class) @RequestMapping(value = "/addOrder", method = RequestMethod.POST) @ResponseStatus(HttpStatus.CREATED) @Res

例如,我有一个豆子

public class Order
{
    int orderID;
    String name;
}
我做了一次手术

@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;
}
在《昂首阔步》中,我有以下几点:

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


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

一种简单的方法是将bean分成两部分——一部分用于创建新对象,另一部分用于扩展现有对象的数据

e、 g

然后让您的POST方法获取一个不完全顺序的对象,并返回一个现有顺序的对象。我还将解除为基础服务分配随机订单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,而是拥有一个完全对称的请求/响应主体。

不要公开您的
Order
实体,而是为请求和响应创建两个不同的DTO,例如
OrderRequest
OrderResponse
如果我不使用两个对象,是否存在安全问题?只使用@JsonProperty(access=access.READ_)吗?我想不会。两个单独类的主要优点是突出显示两种文档格式不同的特性。始终存在这样一种风险:代码的某些部分希望“id”字段具有值,仅仅因为它存在于对象上——因此可能存在更多的错误或误解。
public ExistingOrder addOrder(@Valid @RequestBody IncompleteOrder order) {
        ExistingOrder o = orderService.insertOrder(order);        
        return o;
 }