В предыдущем аналогичном вопросе я спросил о том, как сериализовать два разных набора полей, используя JacksonJson и Spring.
Мой пример использования - это типичное отображение контроллера с @ResponseBody
аннотация, возвращающая непосредственно определенный объект или наборы объектов, которые затем визуализируются с помощью JacksonJson всякий раз, когда клиент добавляет application/json
в заголовок Accept
.
У меня было два ответа, первый предлагает возвращать разные интерфейсыс другим списком геттеров второй предлагает использовать 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 я должен подумать, как изменить исходное отображение моего тестового компонента:
@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
из ниоткуда и out
, который не является типичным сервлетом 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 и как он / она это сделал.Вся концепция кажется интересной, но документации, похоже, не хватает, а также отсутствует пример кода.
Если это невозможно, я просто буду использовать интерфейсы, расширяющие друг друга.Извините за длинный вопрос.