如何在Java + Jersey中使用JSON解析不可变对象

时间:2015-07-04 12:44:53

标签: java jersey gson

所以我只是尝试使用Jersey进行REST服务,似乎我们的工作正常。我只公开get服务,并且我使用这些服务公开的所有对象类型都在Java中具有不可变对象表示。默认情况下,Jersey似乎使用解析器(JAXB?),需要为应该解析的类的@XmlRootElement注释,零arg构造函数和setter。

我一直在使用Gson没有零参数构造函数,没有setter和final在所有字段上都没有任何问题。是否有任何方法可以用泽西岛(即它正在使用的paser)实现这一目标?我已经看到了使用适配器类的解决方案,这些解决方案类将数据从不可变对象映射到可变表示,但是这看起来像很多样板(新类,更多注释等),如果可以使用Gson实现而不添加任何内容。

注意:1)我听说人们推广使用零参数构造函数并声称Gson不应该没有它。这不是我感兴趣的.2)我真的尝试使用谷歌搜索,但我的关键字可能会关闭。换句话说,适度地羞辱我。

编辑1: 如果我喜欢这样的话,我的网络服务就可以了:

$('input[type=checkbox]').click(function(e) {
  var msg = $(this).closest('label').text();
  alert(msg);
});

使用此类公开对象:

@XmlRootElement
public class Code{
    private String code; //Silly object just used for example.
    public Code(){}
    //(G || S)etters
}

如果我使用以下代码替换代码,则Web服务将停止工作:

@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); 
}   

我想要的是能够1)拥有可以从json解析的不可变对象和2)能够在Spring MVC中为我的传入对象定义类似@RequestBody的东西。

1 个答案:

答案 0 :(得分: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