【发布时间】:2014-12-05 10:41:44
【问题描述】:
根据这篇文章(http://restcookbook.com/HTTP%20Methods/put-vs-post/),PUT 应该是一种更新资源的方法。
但是,使用 JAX_RS 2.0 和 Jersey 2.0 练习 RESTful,我认为它不会更新特定资源。 (即我正在使用 JAX_RS 2.0 和 Jersey 2.0 学习 RESTful)
这是一个这样的资源。
<customer>
<name>Before</name>
<postcode>111</postcode>
</customer>
我想做的是更新(也许我应该说“替换”)这个资源。
ClientConfig config = new ClientConfig();
Client client = ClientBuilder.newClient(config);
WebTarget target = client.target("http://xxx/yyy/zzz/end.cust");
Customer cust = new Customer();
cust.setName("After");
cust.setPostcode(222);
target.path("Before").request().put(Entity.xml(cust));
@Id 注释在“Customer”类中设置为“Name”,因此路径“Before”应该用作 ID,第一个资源(名为“Before”)应该替换为第二个资源(命名为“之后”)。
但是,执行上述编码后,“Before”资源仍然存在,并且有一个新的“After”资源。 似乎 PUT 方法用于创建新资源,而不是更新某些内容。 (即有“之前”和“之后”资源,没有任何更新)
为了创建新资源,我测试了一个 POST 方法,它按我的预期创建了一个新资源。
如果您发现我做错了什么或需要做什么,请您给点建议吗?
编辑
我将添加服务器端代码。 @PUT注解的方法是这样的。
@PUT
@Path("{id}")
@Consumes({"application/xml", "application/json"})
public void edit(@PathParam("id") String id, Customer entity) {
super.edit(entity);
}
这是一个名为 CustomerFacadeREST.java 的类,在我创建“来自数据库的 RESTful 服务”后自动创建。
根据NetBeans的文档,super.edit()方法原来是这样的。
public void edit(T entity) {
getEntityManager().merge(entity);
}
在“客户”类中,@Id 以这种方式设置为“名称”值。
public class Customer implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@Basic(optional = false)
@NotNull
@Size(min = 1, max = 80)
@Column(name = "Name")
private String name;
// Other fields, such as Postcode...
public Customer() {
}
// Other constructors and methods...
}
【问题讨论】:
-
您的请求处理代码在哪里?
-
粘贴您的服务器端代码。似乎它不允许您修改
<name/>标签。 -
>Smutje,恐怕我不确定您所说的请求处理代码到底是什么意思。和request()有关系吗?
-
>carlspring,我添加了一些服务器端代码。我希望他们会有所帮助。
标签: java rest jax-rs put http-method