簡體   English   中英

如何在Java + Jersey中使用JSON解析不可變對象

[英]How to JSON parse immutable object in Java + Jersey

所以我只是嘗試了Jersey的REST服務,似乎我們的工作正常。 我只公開get服務,並且我使用這些服務公開的所有對象類型都在Java中具有不可變對象表示。 默認情況下,Jersey似乎使用解析器(JAXB?),需要為應解析的類,零arg構造函數和setter設置@XmlRootElement注釋。

我一直在使用Gson沒有零參數構造函數,沒有setter和final在所有字段上都沒有任何問題。 是否有任何方法可以用澤西島(即它正在使用的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); 
}   

如果我用以下代碼替換代碼,Web服務將停止工作:

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的東西。

實際上,對於Genson而言,這可能非常簡單。 您只需要jar,然后配置Genson功能以使用帶參數的構造函數(如果您不想在其上添加注釋)。

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

或者您可以在參數上使用JsonProperty。 有關更多詳細信息,請參閱用戶指南

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM