Переключить сериализаторы JSON для разных конечных точек - PullRequest
0 голосов
/ 28 февраля 2019

В конечных точках 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 Ответ

0 голосов
/ 01 марта 2019

С точки зрения 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 .Для этого нам нужно создать новый интерфейс:

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 экземпляр.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...