Spring и JacksonJson, сериализуя разные поля с представлениями

В предыдущем аналогичном вопросе я спросил, как сериализовать два разных набора полей с помощью JacksonJson и Spring.

Мой вариант использования - типичное отображение контроллера с аннотацией @ResponseBody , возвращающей непосредственно конкретный объект или коллекции объектов, которые затем отображаются с помощью JacksonJson всякий раз, когда клиент добавляет application / json в заголовке Принять .

У меня было два ответа: первый предлагает возвращать разные интерфейсы с другим списком получателей, второй предлагает использовать Json Views.

У меня нет проблем с пониманием первого способа, однако, что касается второго, после прочтения документации по JacksonJsonViews я не знаю, как реализовать его с помощью Spring.

Чтобы остаться с примером, я бы объявил три класса-заглушки внутри класса Views:

// View definitions:
public class Views {
    public static class Public { }
    public static class ExtendedPublic extends PublicView { }
    public static class Internal extends ExtendedPublicView { }
}

Затем я должен объявить упомянутые классы:

public class PublicView { }   
public class ExtendedPublicView { }

Почему они объявляют пустые статические классы и внешние пустые классы, Я не знаю. Я понимаю, что им нужна «метка», но тогда будет достаточно статических членов Views. И дело не в том, что ExtendedPublic расширяет Public , как это было бы логично, но на самом деле они совершенно не связаны.

И, наконец, компонент с аннотацией указывает представление или список представлений:

//changed other classes to String for simplicity and fixed typo 
//in classname, the values are hardcoded, just for testing
public class Bean {
    // Name is public
    @JsonView(Views.Public.class)
    String name = "just testing";

    // Address semi-public
    @JsonView(Views.ExtendedPublic.class)
    String address = "address";

    // SSN only for internal usage
    @JsonView(Views.Internal.class)
    String ssn = "32342342";
}

Наконец, в Spring Controller я должен подумать, как изменить исходное отображение моего тестового bean-компонента:

@RequestMapping(value = "/bean") 
@ResponseBody
public final Bean getBean() {
    return new Bean();
}

Он говорит, чтобы вызвать :

//or, starting with 1.5, more convenient (ObjectWriter is reusable too)
objectMapper.viewWriter(ViewsPublic.class).writeValue(out, beanInstance);

Итак, у меня есть экземпляр ObjectMapper , появляющийся из ниоткуда, и выход , что не является типичным сервлетом PrintWriter out = response.getWriter (); , но является экземпляром JsonGenerator и не может быть получен с помощью оператора new. Итак, я не знаю, как изменить метод, вот неполная попытка:

@RequestMapping(value = "/bean")
@ResponseBody
public final Bean getBean() throws JsonGenerationException, JsonMappingException, IOException {
    ObjectMapper objectMapper = new ObjectMapper();
    JsonGenerator out; //how to create?
    objectMapper.viewWriter(Views.Public.class).writeValue(out, new Bean());
    return ??; //what should I return?
}

Итак, я хотел бы знать, добился ли кто-нибудь успеха, используя JsonView со Spring, и как он это сделал. Вся концепция кажется интересной, но кажется, что отсутствует документация, также отсутствует пример кода.

Если это невозможно, я просто буду использовать интерфейсы, расширяющие друг друга. Простите за длинный вопрос.

10
задан Community 23 May 2017 в 12:19
поделиться