2016-05-13 2 views
2

У нас есть интерфейсная служба, которая использует фоновый сервис для получения списка объектов Metric. Мы создали Java ClientSDK для внутреннего сервиса, чтобы облегчить жизнь для клиентских приложений этой службы.Предоставление подмножества объекта Java для JSON

Мы также показываем список показателей из службы front-end. Пока что мы непосредственно разоблачаем и конвертируем back-end объекты Metric в JSON.

Я обеспокоен тем, что если изменения будут внесены в базовый объект Metric - скажем, разработчик добавляет новое поле секретного идентификатора - мы не хотим выставлять его из службы front-end.

Мы также пишем clientSDK для службы front-end. Мы не хотим ссылаться на класс Metric из back-end clientSDK, поэтому логическая опция заключается в определении аналогичного объекта Metric в интерфейсном SDK.

Я не хочу тратить процессорные циклы, копируя 1000-ые метрики из одного определения класса в другое.

Есть ли способ указать, какие поля я должен выставить из базового метрика в определение класса Metric, когда я перехожу к JSON? Еще лучше, могу ли я ссылаться на определение front-end на JSON-конвертер, как я прошу его маршалировать back-end объект?

Мы используем Jackson с фреймворком Spring для контекста, но я был бы счастлив бросить это в такт, поскольку маршалинг объектов через аннотации, по-видимому, является основной причиной этой проблемы.

ответ

3

Взгляните на конструкцию Jackson's JsonView.

Я могу видеть ваш пример выглядеть примерно так:

class Views { 
    static class Client {} 
    static class Backend extends Client {} 
} 

public class Metric { 
    @JsonView(Views.Client.class) String metricName; 
    @JsonView(Views.Client.class) String count; 
    @JsonView(Views.Backend.class) String secretKey; 
} 

@JsonView аннотацию поддерживается Spring @ResponseBody аннотированные методы, как из Spring 4.1.

+0

Существует также '@ JsonIgnore' аннотаций, которые в зависимости от точной настройки операционной в могут быть проще выбором. – ingenious

0

Как Nicholas Hausschild предложил, что вы можете достичь этого путем аннотаций с помощью вашей маршаллирующей/немаршаллирующей структуры.

Однако вы можете просто использовать наследование и литье, как это:

class SomeSuperClass { 
    String exposeThis; 
    String exposeThat; 
    // getters and setters... 
} 

class SomeSubClass extends SomeSuperClass { 
    String doNotExposeThis; 
    // getters and setters... 
} 

Таким образом, вы можете бросить в супер класс при возврате объекта в JSON парсер, и в то же время использовать подкласс внутренне нести дополнительную информацию, которую вы действительно не хотите раскрывать.

0

Другой возможностью является использование Mixins, поэтому вы можете определить разные сценарии, не касаясь оригинала DTO.

Я лично использую библиотеку, которую я написал для достижения этой цели динамически:

https://github.com/Antibrumm/jackson-antpathfilter

Это хорошо работает для не слишком глубоких графиков, еще кто-то писал другой подход подобным образом здесь, который кажется более производительным для них сценарии, но ведет себя немного иначе.

https://github.com/krishna81m/jackson-nested-prop-filter

Смежные вопросы