REST中,我们可以把接受POST请求的方式写成如下的方式:
@POST
@Consumes(MediaType.APPLICATION_JSON)public Response createProduct(CreateProductJson createProductJson, @Context UriInfo uriInfo) {
CreateProductJson就是我们服务器用来接收CreateProudct这样一个请求的JSON表达方式,然后我们可以通过createProductJson.getProduct()这样类似的方法得到product对象,然后再将围绕着product这一领域对象进行处理
这样看似还不错,CreateProductJson就类似成为了我们的DTO对象,但是这里有一个问题就是CreateProductJson的容错性比较差。假如,我们当前的product需要两个字段:name、price。但是客户端如果多传输给我们了一个description,那么很有可能我的反序列化CreateProductJson对象的时候就会抛异常,丢出400 Bad Request错误。这么严格的要求往往是没有必要的。一些相关的解释可以参考Martin Fowler的讲解《Customer Driven Contract》
那我们怎么能够做的容错性更好呢?其实非常简单
@POST
@Consumes(MediaType.APPLICATION_FORM_URLENCODED)
public Response createProduct(Form form) {
我们只要再定义一个transformer就行了,比如,定义ProductForm,它其中含有一个方法getProduct(),这个方法中我们只从form去取我们真正需要的数据,对于多余的数据,我们可以置之不理。
Jersey中处理POST格式的Best Practice,布布扣,bubuko.com
原文地址:http://blog.csdn.net/kiwi_coder/article/details/34598301