как упорядочить объект и вернуть как представление (а не как страницу JSP) весной + xstream - PullRequest
0 голосов
/ 18 января 2011

Я пытаюсь следовать этому руководству и создать службу 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 - успешно выполненный запрос

1 Ответ

2 голосов
/ 20 января 2011

Понял наконец! Сначала я попробовал другой маршаллер - JAXB2, но xstream также должен работать.

Следующее - это определение - оказывается, по какой-то причине конфигурация использует это (неправильно):

<beans:bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
    <beans:property name="prefix" value="/WEB-INF/views/" />
    <beans:property name="suffix" value=".jsp" />
</beans:bean>

с использованием только InternalResourceViewResolver

, а определение для org.springframework.web.servlet.view.BeanNameViewResolver игнорируется. Решением для этого является определение их обоих в одном компоненте с именем ContentNegotiatingViewResolver следующим образом:

    <bean class="org.springframework.web.servlet.view.ContentNegotiatingViewResolver">
    <property name="viewResolvers">
            <list>
                    <bean class="org.springframework.web.servlet.view.BeanNameViewResolver" />
                    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
                            <property name="prefix" value="/WEB-INF/jsp/" />
                            <property name="suffix" value=".jsp" />
                    </bean>
            </list>
    </property>
</bean>
<oxm:jaxb2-marshaller id="marshaller">
        <oxm:class-to-be-bound name="com.mycompany.dashboard.Person" />
</oxm:jaxb2-marshaller>

<bean name="person" class="org.springframework.web.servlet.view.xml.MarshallingView">
        <constructor-arg ref="marshaller" />
</bean>

Эта конфигурация решила мои проблемы, и объект персонажа, с которым я играл, не был направлен в представление JSP, но маршаллер повернулся к XML:

    @RequestMapping(value = "/person", method = RequestMethod.GET)
public ModelAndView addPerson() {
    Person person = new Person();
    person.setAddress("address 123");
    person.setAge(50);
    person.setName("Andrew");
    System.out.println("new person: " + person);
    ModelAndView mav = new ModelAndView("person",BindingResult.MODEL_KEY_PREFIX + "person",person);
    return mav;

Надеюсь, это поможет другим и в будущем.

...