Подтвердить что ты не робот

Spring MVC 3: Возврат XML через @ResponseBody

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

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

Прямо сейчас, хотя этот API вызывается, моя клиентская сторона вообще не получает ответ XML. Я читал несколько мест, и мне кажется, что мне нужно настроить XML-маршаллер или somesort 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, чтобы заставить это работать? Большое спасибо.

4b9b3361

Ответ 1

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

<mvc:annotation-driven/>

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

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

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

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

Ответ 2

Я решил эту проблему с 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);
}

что все. приветствия

Ответ 3

Что я делаю, когда хочу вернуть 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"/>

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

@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

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

@RequestMapping(value = "/mylink", method = RequestMethod.GET, produces = MediaType.APPLICATION_XML_VALUE)

Ответ 6

Добавление 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 {

}