В предыдущем аналогичном вопросе я спросил о том, как сериализовать два разных набора полей, используя 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
, поскольку это было бы логично, но они на самом деле абсолютно не связаны.
И, наконец, bean будет указывать с аннотацией представление или список представлений:
//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 я должен подумать, как изменить исходное сопоставление моего теста 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
, выходящий из ниоткуда, и out
, который не является типичным сервлетом PrintWriter out = response.getWriter();
, но является экземпляром JsonGenerator
и не может быть получен с новым оператором. Поэтому я не знаю, как изменить метод, вот неполная попытка:
@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 и как он это сделал. Вся концепция кажется интересной, но документация кажется недостаточной, также отсутствует код примера.
Если это невозможно, я просто буду использовать интерфейсы, расширяющие друг друга. Извините за длинный вопрос.