2016-12-30 67 views
0

比如我有一颗豆隐藏ID,但回报ID上创建

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_img

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

像@ApiModelProperty只读属性会解决什么?

+1

不要公开你的Order实体,而是为请求和响应创建两个不同的DTO,例如, 'OrderRequest','OrderResponse' –

回答

3

一个简单的方法是将你的bean分成两部分来创建一个新的对象,另一个是对现有对象的数据进行扩展。

例如

public class IncompleteOrder { 
    String name; 
} 

public class ExistingOrder extends IncompleteOrder { 
    int id; 
} 

然后让你的POST方法采取IncompleteOrder的对象,并返回ExistingOrder之一。我还delegrate责任分配随机顺序编号底层服务...

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

同样的事情可能因与没有继承关系,这可能是合适的两个完全独立的类来实现,如果有是创建新订单所需信息与现有订单信息之间的重大分歧。

另一种方法是询问id实际是什么 - 为什么你的客户端会得到整数id?理想情况下,如果他们需要关于订单的任何信息,他们应该查询资源的API,并且要做到这一点,他们需要订单的URI而不是整数ID。所以外部服务沟通一个订单应该来回传递URI而不是ID。也许你可以鼓励你的客户通过你在POST请求中的位置标题中返回的URI与每个客户进行通信?然后,您可以避免在响应中公开该ID,并拥有纯粹对称的请求/响应主体。

+0

是否有任何安全问题,如果我不使用2个对象?并只使用@JsonProperty(access = access.READ_ONLY)? – feco

+1

我想不是。两个单独的类的主要优点是强调两种文档格式不同。代码的某些部分总是存在风险,因为它存在于对象上,所以'id'字段有一个值 - 所以可能会有更多的错误或误解。 – sisyphus