亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

為不同的端點切換 JSON 序列化程序

為不同的端點切換 JSON 序列化程序

qq_花開花謝_0 2022-07-14 17:18:21
在Jersey的端點中,我想返回相同的DTO內容,但通過使用不同的序列化程序對其進行不同的序列化:Date需要不同的格式。public class Foo {    private Date foo;    public Foo() {        this.foo = new Date();    }    public Date getFoo() {        return foo;    }    public void setFoo(Date foo){        this.foo = foo;    }}public class MyEndpointsUnix {    @GET    @Path("/dateAsUnix")    public Foo getDateAsUnix() {        return new Foo();    }}public class MyEndpointsUTC {    @GET    @Path("/dateAsUTC")    public Foo getdateAsUTC() {        return new Foo();    }}我想應該可以手動更改序列化程序以進行響應。
查看完整描述

1 回答

?
莫回無

TA貢獻1865條經驗 獲得超7個贊

從OOP角度來看,我們可以為每種類型創建新類view:


class UnixFoo extends Foo {


    private Foo foo;


    public UnixFoo(Foo foo) {

        this.foo = foo;

    }


    @JsonFormat(pattern = "yyyy-MM-dd")

    @Override

    public Date getFoo() {

        return foo.getFoo();

    }


    // other getters

}

在我們的控制器中,我們可以:


public class MyEndpointsUnix {

    @GET

    @Path("/dateAsUnix")

    public Foo getDateAsUnix() {

        return new UnixFoo(new Foo());

    }

}

當然,這個解決方案有一個缺點,我們需要復制我們的DTO類。為了避免這種情況,我們可以使用Jackson MixIn Annotation。為此,我們應該創建新接口:


interface UnixFooMixIn {


    @JsonFormat(pattern = "yyyy-MM-dd")

    Date getFoo();

}

并豐富ObjectMapper它:


public class MyEndpointsUnix {

    @GET

    @Path("/dateAsUnix")

    public String getDateAsUnix() {

        ObjectMapper mapper = new ObjectMapper();

        mapper.enable(SerializationFeature.INDENT_OUTPUT);

        mapper.addMixIn(Foo.class, UtcFooMixIn.class);


        return mapper.writeValueAsString(new Foo());

    }

}

在這種情況下,我們需要更改方法簽名并返回String。我們也可以創建ObjectMapper一次并將其用作單例。對于每一種view我們都需要定義新的interface和新的ObjectMapper實例。


查看完整回答
反對 回復 2022-07-14
  • 1 回答
  • 0 關注
  • 109 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號