Spring Restful, публикация нескольких форматов, таких как объект json / xml / domain, в одно действие - PullRequest
1 голос
/ 24 ноября 2011

Я пишу приложение веб-сервисов Spring Restful, используя Spring MVC.Я использовал просмотрщик согласования контента, чтобы ответить, например, на несколько форматов данных.Если кто-то запрашивает URL с расширением .xml, XML будет отправляться в теле ответа аналогично, если кто-то запрашивает расширение .json, в теле ответа будет отправляться json.

Теперь я хочу, чтобы внутри был тот же процесс, скажем, если кто-то хочет опубликовать Json или xml или простую запись из формы веб-страницы, используя метод post для одного и того же действия, он должен уметь обрабатывать все это.

Таким образом я смогу написать веб-сервис + веб-приложение в одном приложении Spring MVC + Restful.

Заранее спасибо за помощь:)

Ответы [ 2 ]

2 голосов
/ 24 ноября 2011

Вы можете использовать атрибут headers аннотации @RequestMapping.

@RequestMapping(value = "/pets", method = RequestMethod.POST, headers="content-type=text/*")

, чтобы сузить тип контента запросов, которые будет обрабатывать ваш метод.

edit:

Если вы хотите отправить другой тип контента в теле запроса, то единственное, что вам нужно сделать, это определить MessageConverter (я полагаю, вы это уже сделали) и аннотировать ваш методпараметр с

@RequestBody 

Spring должен десериализовать тело вашего запроса, используя определенный вами MessageConverter.

Итак, если у вас есть что-то вроде:

<bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">
    <property name="messageConverters">
        <util:list>
            <bean class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter"/>
        </util:list>
    </property>
</bean>

<bean id="contentNegotiatingViewResolver" class="org.springframework.web.servlet.view.ContentNegotiatingViewResolver">
    <property name="mediaTypes">
        <util:map>
            <entry key="json" value="application/json"/>
        </util:map>
    </property>
    <property name="defaultViews">
        <util:list>
            <bean class="org.springframework.web.servlet.view.json.MappingJacksonJsonView"/>
        </util:list>
    </property>
</bean>

в вашей пружинеконтекст.

Аннотируйте ваш метод следующим образом:

@RequestMapping(method=PUT, value="/user/{user_id}")
public void putUser(@RequestBody User user, @PathVariable int user_id) {
    ...
}

должен выполнить работу.

1 голос
/ 25 ноября 2011

Вам не нужно ничего делать.Вы регистрируете новообращенных, и они в свою очередь сообщают «пружине», с какими типами контента они могут работать.XStream регистрирует application / xml и text / xml (возможно, больше), Джексон регистрирует application / json и т. Д.

Все это доступно на http://static.springsource.org/spring/docs/3.0.x/spring-framework-reference/html/mvc.html#mvc-ann-responsebody

Мне также не нравится имя файла-стандарт, я предпочитаю оставить тот же конвертер.В этом случае он будет смотреть на заголовок Accept.Если вы хотите JSON, установите Accepts: application/json.

...