Я пытаюсь следовать этому руководству и создать службу RESTful, которая может / маршалировать объект в / из XML.
http://www.stupidjavatricks.com/?p=54
Выбранный в статье маршаллер - xStream (я обнаружил, что его очень легко использовать и настраивать).
Суть в том, что с помощью STS - собственного варианта Spring Eclipse в комплекте с tcServer - я создал проект на основе шаблона STS MVC. Это устаревший проект, начатый с версии Spring 2.4, и я перенес его на версию 3.0. Итак, шаблон создал всю необходимую разметку XML, и я добавил свою конфигурацию, чтобы указать представление на правильное преобразование объекта (в маршалер xstream).
Вот часть моего bean-компонента, который отправляет объект в новое представление (скопировано из ссылки):
<bean id="bookXmlView" class="org.springframework.web.servlet.view.xml.MarshallingView">
<constructor-arg>
<bean class="org.springframework.oxm.xstream.XStreamMarshaller">
<property name="autodetectAnnotations" value="true"/>
</bean>
</constructor-arg>
</bean>
Все работало хорошо, пока я не установил последнюю версию STS 2.5.2.RELEASE и не создал новый проект MVC из шаблона. (Новый шаблон больше не использует urlrewrite.xml, кроме некоторых других изменений).
Я установил правильную конфигурацию 1 на 1, как подсказывает учебник, но теперь, несмотря ни на что, представление всегда направлено на JSP, поэтому, если мой контроллер выглядит следующим образом:
@RequestMapping(value = "/authors/{authorId}")
public ModelAndView getAuthorById(@PathVariable String authorId) {
Author author = bookService.getAuthorById(authorId);
ModelAndView mav =new ModelAndView("bookXmlView", BindingResult.MODEL_KEY_PREFIX+"author", author);
return mav;
}
Он всегда будет пытаться вернуться к представлению author.jsp, а не к объекту как XML. Я перепробовал много вещей безуспешно. Есть идеи, почему это происходит и как это исправить?
ОБНОВЛЕНИЕ -------------------
Как уже отмечалось, я добавил журналы:
Я установил уровень DEBUG и обнаружил кое-что:
DEBUG : org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping - отклоненное имя компонента 'org.springframework.context.annotation.internalConfigurationAnnotationProcessor': не определены пути URL * 1028
DEBUG : org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping - отклоненное имя компонента 'org.springframework.context.annotation.internalAutowiredAnnotationProcessor': пути URL не определены
DEBUG : org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping - отклоненное имя компонента 'org.springframework.context.annotation.internalRequiredAnnotationProcessor': пути URL не определены
DEBUG : org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping - отклоненное имя компонента 'org.springframework.context.annotation.internalCommonAnnotationProcessor': пути URL не определены
DEBUG: org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping - отклоненное имя компонента 'bookXmlView': пути URL не определены
Обратите внимание на эту строку: Отклоненное имя компонента 'bookXmlView': пути URL не определены.
Поиск этого указывает на конфликт между <mvc:annotation-driven />
и моими аннотациями autodetect в настройках xstream?
В любом случае, после перехода по ссылке я получил следующую запись в журнале. Обратите внимание, что он перенаправляет представление в /WEB-INF/views/bookXmlView.jsp:
DEBUG : org.springframework.web.servlet.DispatcherServlet - DispatcherServlet с именем 'appServlet', обрабатывающий GET-запрос для [/ test / page_init]
DEBUG : org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping - отображение [/ page_init] на HandlerExecutionChain с обработчиком [test.test.test.HomeController@a087de] и 2 перехватчиками * 1055
DEBUG : org.springframework.web.servlet.DispatcherServlet - Последнее измененное значение для [/ test / page_init] равно: -1
DEBUG : org.springframework.web.bind.annotation.support.HandlerMethodInvoker - Метод обработчика вызова: открытый org.springframework.web.servlet.ModelAndView test.test.test.HomeController.get 10b () *
DEBUG : org.springframework.beans.factory.support.DefaultListableBeanFactory - Вызывает afterPropertiesSet () для бина с именем 'bookXmlView'
DEBUG : org.springframework.web.servlet.DispatcherServlet - представление рендеринга [org.springframework.web.servlet.view.JstlView: name 'bookXmlView';URL [/WEB-INF/views/xmlView.jsp]] в DispatcherServlet с именем appServlet
DEBUG : org.springframework.web.servlet.view.JstlView - Добавлен объект модели'org.springframework.validation.BindingResult.books' типа [test.test.test.ObjectTest] для запроса с именем 'bookXmlView'
DEBUG : org.springframework.web.servlet.view.JstlView - пересылка на ресурс [/WEB-INF/views/xmlView.jsp] в InternalResourceView 'bookXmlView'
DEBUG : org.springframework.web.servlet.DispatcherServlet - успешно выполненный запрос