【发布时间】:2015-09-22 02:52:56
【问题描述】:
所以我只是在尝试 Jersey 的 REST 服务,看起来我们工作得很好。我只公开了 get 服务,并且我使用这些服务公开的所有对象类型在 Java 中都有一个不可变的对象表示。默认情况下,Jersey 似乎使用解析器(JAXB?),需要为应该解析的类、零参数构造函数和设置器添加 @XmlRootElement 注释。
我一直在使用没有零参数构造函数的 Gson,在所有字段上都没有 setter 和 final,完全没有问题。有没有办法用 Jersey(即它正在使用的 paser)来实现这一点?我已经看到了适配器类的解决方案,它们将数据从不可变对象映射到可变表示,但这似乎是很多样板文件(新类、更多注释等),如果它可以通过 Gson 实现而不添加任何内容。
注意:1)我听说有人提倡使用零参数构造函数,并声称没有它 Gson 不应该工作。这不是我感兴趣的。2)我真的尝试过用谷歌搜索,但我的关键字可能已关闭。换句话说,适度羞辱我。
编辑 1: 如果我这样做,我的网络服务可以工作:
@XmlRootElement
public class Code{
private String code; //Silly object just used for example.
public Code(){}
//(G || S)etters
}
通过这个类暴露对象:
@GET
@Produces(MediaType.APPLICATION_JSON)
public Set<Code> get(@QueryParam("name") String name) { // Here I want to use a class of my own instead of String name, haven't figured out how yet.
return this.codeService.get(name);
}
如果我将代码替换为以下内容,网络服务将停止工作:
public class Code{
private final String code;
@JsonCreator
public Code(@JsonProperty("code") String code) {
this.code = code;
}
//Getters omitted
}
我想要的是能够 1) 拥有可以解析到/从 json 解析的不可变对象,以及 2) 能够在 Spring MVC 中为我的传入对象定义类似 @RequestBody 的东西。
【问题讨论】:
-
我不使用 Gson,但 Jackson 和 @JsonCreator,如 here 所示,是一种选择。
-
没有解决我的问题。我更新了描述,你能看出我犯了什么明显的错误吗?
-
这有什么问题?你有错误吗?如果是这样,是什么? GET方法也有问题。?不可变对象对 GET 应该没有问题,因为只会在对象上调用 getter。当框架需要创建对象时,它与 POST 一起使用,没有无参数的构造函数成为问题。
-
还要确保添加实际的 Jackson JAX-RS 提供程序,而不仅仅是核心 Jackson 库。这取决于您使用的是哪个 Jersey 版本,让我为您指出要添加哪些依赖项的方向。
-
我有一种感觉,this 会让您更好地了解一切是如何运作的,以及可能存在的问题。