为了账号安全,请及时绑定邮箱和手机立即绑定

为不同的端点切换 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 关注
  • 85 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信