В предыдущем аналогичном вопросе я спросил, как сериализовать два разных набора полей с помощью 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, и как он это сделал. Вся концепция кажется интересной, но кажется, что отсутствует документация, также отсутствует пример кода.
Если это невозможно, я просто буду использовать интерфейсы, расширяющие друг друга. Простите за длинный вопрос.