【问题标题】:How to JSON parse immutable object in Java + Jersey如何在 Java + Jersey 中 JSON 解析不可变对象
【发布时间】: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 会让您更好地了解一切是如何运作的,以及可能存在的问题。

标签: java jersey gson


【解决方案1】:

实际上,使用Genson 可以很容易地做到这一点。您只需要 jar,然后配置 Genson 功能以使用带参数的构造函数(如果您不想在其上添加注释)。

Genson genson = new GensonBuilder().useConstructorWithArguments(true).create();
// and then register it with jersey
new ResourceConfig().register(new GensonJaxRSFeature().use(genson));

或者您可以在参数上使用 JsonProperty。有关详细信息,请参阅User Guide。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-07
    • 1970-01-01
    • 2016-02-13
    • 2011-06-28
    • 2015-01-15
    相关资源
    最近更新 更多