如何在@PUT方法中传递多个参数?

时间:2014-05-19 11:15:38

标签: apache rest jaxb cxf jax-rs

我需要在Apache CXF JAX-RS中实现这样的方法(在并发场景中)

@PUT
@Path("/customers/123")
public void updateConcurrentCustomer(Customer existingCustomer,Customer updatedCustomer,boolean forceUpdate){
......
}

在请求体中,我需要调用此方法(无根元素)。

<Customer>
.....existing data....
</Customer>
<Customer>
......updated data....
</Customer>
<boolean>true</boolean>

如何实现这种数据绑定?

我尝试创建一个像这样的复合包装器资源类

@XmlRootElement
public class CustomCustomer implements java.io.Serializable
{
    private Customer  existingCustomer;
    private Customer  updatedCustomer;
    private boolean forceUpdate;
    .....
    .....

}

效果很好。但我不想创建这个包装类。

我的并发场景:

  1. customer123对象处于A状态。

  2. user1将customer123更改为状态B.

  3. user2将customer123更改为州C.

  4. user3将customer123更改为州D.(所有同时)

  5. 只有高优先级用户设置forceUpdate标志,最后该更新将被覆盖。

    existingCustomer - 将用于检测冲突更改。它将处于A状态

1 个答案:

答案 0 :(得分:0)

根据definition

  

PUT方法请求将所包含的实体存储在   提供了Request-URI。如果Request-URI引用已存在的URI   资源,封闭的实体应该被视为修改过的   驻留在原始服务器上的版本。

首先,您的客户需要一个唯一的标识符,例如/customers/{id}。否则,服务器无法知道资源的存储位置。

然后你不需要通过现有的客户。要么没有(新资源),要么服务器已经知道他(因为你用一个唯一的URL对他说话)。

forceUpdate在这里也没有意义。如果资源已经存在,则PUT应该修改,因此forceUpdate为true。

有时您无法使用PUT的清晰语义。例如,如果客户不知道ID,并且您不希望客户选择一个(他不能保证唯一性)。然后您可以使用POST,服务器将返回存储资源的位置。

此外,如果您只想在特殊情况下更新,可能取决于其他一些参数,POST是适当的方法。