我需要在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;
.....
.....
}
效果很好。但我不想创建这个包装类。
customer123对象处于A状态。
user1将customer123更改为状态B.
user2将customer123更改为州C.
user3将customer123更改为州D.(所有同时)
只有高优先级用户设置forceUpdate标志,最后该更新将被覆盖。
existingCustomer - 将用于检测冲突更改。它将处于A状态
答案 0 :(得分:0)
PUT方法请求将所包含的实体存储在 提供了Request-URI。如果Request-URI引用已存在的URI 资源,封闭的实体应该被视为修改过的 驻留在原始服务器上的版本。
首先,您的客户需要一个唯一的标识符,例如/customers/{id}
。否则,服务器无法知道资源的存储位置。
然后你不需要通过现有的客户。要么没有(新资源),要么服务器已经知道他(因为你用一个唯一的URL对他说话)。
forceUpdate在这里也没有意义。如果资源已经存在,则PUT应该修改,因此forceUpdate为true。
有时您无法使用PUT的清晰语义。例如,如果客户不知道ID,并且您不希望客户选择一个(他不能保证唯一性)。然后您可以使用POST,服务器将返回存储资源的位置。
此外,如果您只想在特殊情况下更新,可能取决于其他一些参数,POST是适当的方法。