Spring3 REST Web-сервисы с JSONViews Джексона - PullRequest
2 голосов
/ 23 февраля 2011

Я настроил простой веб-проект spring3 и у меня есть метод контроллера, подобный этому:

@RequestMapping(method = RequestMethod.GET, value = "/book/{id}", headers = "Accept=application/json,application/xml")
public @ResponseBody
Book getBook(@PathVariable final String id)
{
    logger.warn("id=" + id);
    return new Book("12345", new Date(), "Sven Haiges");
}

Возвращает новый объект книги, который будет преобразован в JSON или XML из-за преобразователей, которые я установил в конфигурации весны:

<bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">
    <property name="messageConverters">
        <list>
            <ref bean="jsonConverter" />
            <ref bean="marshallingConverter" />
        </list>
    </property>
</bean>

Генерация JSON (и XML) все работает, но я хотел бы иметь возможность определить несколько представлений для данных. Например, я хотел бы указать подробное представление с меньшим количеством свойств в предоставляемом JSON / XML и подробное представление с полным набором свойств.

Используя ObjectMapper Джексона, это возможно так:

objectMapper.writeValueUsingView(out, beanInstance, ViewsPublic.class);

Есть ли способ настроить Spring на использование определенного VIEW (подробное описание)? Единственный способ добиться этого прямо сейчас - использовать разные DTO, возвращаемые из методов моего контроллера.

Thanx!

1 Ответ

1 голос
/ 23 февраля 2011

Если вам нужен этот уровень контроля, то вам нужно сделать это самостоятельно.

Поэтому вместо использования @ResponseBody вместо написания ответа вручную используйте собственный ObjectMapper, например,

private final ObjectMapper objectMapper = new ObjectMapper();

@RequestMapping(method = RequestMethod.GET, value = "/book/{id}", headers = "Accept=application/json,application/xml")
public void getBook(@PathVariable final String id, HttpServletResponse httpResponse)
{
    logger.warn("id=" + id);
    Book book = new Book("12345", new Date(), "Sven Haiges");
    objectMapper.writeValueUsingView(httpResponse.getWriter(), book, ViewsPublic.class);
}

Кстати, writeValueUsingView устарело в текущей версии JSON (см. javadoc ).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...