Spring MVC 3: возвращение XML через @ResponseBody - PullRequest
23 голосов
/ 01 февраля 2011

Прошу прощения за публикацию этого вопроса noob, но я уже довольно давно устраняю эту проблему. У меня возникла небольшая проблема при попытке получить ответ для возврата XML на основе объекта: -

@RequestMapping(value = "/mylink", method = RequestMethod.GET)
public @ResponseBody SomeObject doIt() {
    ...
}

Прямо сейчас, несмотря на то, что этот API вызывается, моя клиентская сторона вообще не получает XML-ответ. Я читал несколько мест, и мне кажется, что мне нужно настроить маршаллер XML или какой-нибудь определитель XML, но я не уверен, как интегрировать этот фрагмент в мою существующую конфигурацию. В настоящее время у меня есть следующая конфигурация в моем servlet.xml: -

<context:component-scan base-package="ss.controller" />

<mvc:annotation-driven />

<mvc:resources location="/resources/" mapping="/resources/**" />

<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
    <property name="prefix" value="/WEB-INF/jsp/app/" />
    <property name="suffix" value=".jsp" />
</bean>

Может кто-нибудь опубликовать примеры конфигурации, как я могу настроить мой servlet.xml, чтобы это работало? Большое спасибо.

Ответы [ 6 ]

22 голосов
/ 01 февраля 2011

Это можно сделать, добавив следующий бит магии в контекст Spring (см. docs ):

<mvc:annotation-driven/>

, который, помимо прочего, обеспечивает:

Поддержка чтения и записи XML, если JAXB присутствует в пути к классам.

Если обнаружен JAXB (то есть, если вы на Java6 или у вас есть какая-либо реализация JAXB на вашем пути к классам), это зарегистрирует Jaxb2RootElementHttpMessageConverter с контекстом и предоставит возможность выплюнуть XML из возвращаемого значение @ResponseBody -аннотированного метода.

Примечание. В вашем вопросе предложено использовать ViewResolver для рендеринга XML, но это не обязательно. Аннотация @ResponseBody предназначена для полного обхода слоя вида.

16 голосов
/ 06 февраля 2013

Я решил эту проблему с Spring 3 mvc без MarshallingView

@RequestMapping(value = "actionName.xml", method = RequestMethod.GET)
public HttpEntity<byte[]> getXml(ModelMap map, HttpServletResponse response) {

    String xml = generateSomeXml();

    byte[] documentBody = xml.getBytes();

    HttpHeaders header = new HttpHeaders();
    header.setContentType(new MediaType("application", "xml"));
    header.setContentLength(documentBody.length);
    return new HttpEntity<byte[]>(documentBody, header);
}

и все.привет

7 голосов
/ 01 февраля 2011

Что я делаю, когда хочу вернуть XML-представление объектов, используя spring, так это то, что я определяю MarshallingView, например,

<!-- XML view using a JAXB marshaller -->
<bean id="jaxbView" class="org.springframework.web.servlet.view.xml.MarshallingView">
    <constructor-arg>
        <bean id="jaxb2Marshaller" class="org.springframework.oxm.jaxb.Jaxb2Marshaller">
            <property name="classesToBeBound">
                <list>
                    <value>com.company.AClass</value>
                </list>
            </property>
        </bean>
    </constructor-arg>
</bean>

<!-- Resolve views based on string names -->
<bean class="org.springframework.web.servlet.view.BeanNameViewResolver"/>

Обратите внимание, что существует целый мир альтернатив к черту.Следующий шаг -

@RequestMapping("/request")
public ModelAndView sample() {
    return new ModelAndView("jaxbView", "data", "data_to_be_turned_into_xml");
}

Или, если вы хотите использовать аннотацию ResponseBody, она будет выглядеть следующим образом:

@RequestMapping("/request")
@ResponseBody
public void sample() {
    return "data_to_be_turned_into_xml"
}

Обратите внимание, что для этого необходимо определить HttpMessageConverter ,См. Документацию spring для идеального примера того, как это сделать.

5 голосов
/ 01 февраля 2011

Возможно, вам придется либо использовать XML Marshalling View или настроить MarshallingHttpMessageConverter.

Вот краткий Справочник по использованию @ResponseBody с преобразователями .

2 голосов
/ 26 апреля 2015

Попробуйте добавить produces = MediaType.APPLICATION_XML_VALUE, т.е.

@RequestMapping(value = "/mylink", method = RequestMethod.GET, produces = MediaType.APPLICATION_XML_VALUE)
0 голосов
/ 11 марта 2017

Добавление produces = MediaType.APPLICATION_XML_VALUE к RequestMapping и @XmlRootElement к вершине объекта вашей модели должно работать

@RequestMapping(value = "/mylink", method = RequestMethod.GET, produces = MediaType.APPLICATION_XML_VALUE)
public SomeObject doIt(){
    return new SomeObject();
}

@XmlRootElement
public class SomeObject {

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