0

问题很简单,但有点难以解释。

我有这样的 REST 服务:

@Path("categories")
@RequestScoped
public class CategoryResource {

    @Inject
    CategoriesFacade dao;

    @PUT
    @Consumes("application/json")
    public void putJson(Categories content) {
        System.err.println(content.toString()); // <-- ?????
        dao.edit(content);
    }

    // ....
}

和这样的实体对象:

@XmlRootElement
public class Categories implements Serializable {

    @Id
    @Column(name = "CATEGORY_ID", unique = true, nullable = false, precision = 5)
    private Integer categoryId;

    @Column(name = "NAME")
    private String name;

    @JoinColumn(name = "PARENT_ID", referencedColumnName = "CATEGORY_ID")
    @ManyToOne
    private Categories parentId;

    // ....    

}

这是http请求有效负载:

PUT http://localhost:8080/api/categories
Data: {"categoryId":"7162","name":"test","parentId":null}

这是我在@PUT请求中获得的类别对象(参见标有 ???? 的行):

Categories{
  categoryId=7162,
  name=test,
  parentId=Categories{categoryId=null, name=null, parentId=null}
}

因此,正如您在此处看到的,parentId分配了空Categories对象,这样我得到了 ValidationException,因为name不能为空。

知道如何让 Jersey 给我这种对象,所以 parentId 的 null 值就可以了:

Categories{
  categoryId=7162,
  name=test,
  parentId=null
}
4

1 回答 1

0

在客户端站点上对您的对象进行字符串化(例如,如果客户端在 JavaScropt 上,则使用方法JSON.stringify)。
休息方法制作

@PUT
@Consumes("application/json")
public void putJson(String content) {  

并将 json 字符串转换为对象(例如,使用 google json)

Categories cont = new com.google.gson.Gson().fromJson(content, Categories.class);
于 2012-08-18T10:50:58.027 回答