为不同的端点切换 JSON 序列化程序

在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();

    }

}

我想应该可以手动更改序列化程序以进行响应。


qq_花开花谢_0
浏览 86回答 1
1回答

莫回无

从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实例。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java