Выделение разных классов с помощью Spring MVC и JIBX - PullRequest
3 голосов
/ 28 января 2011

Мы пытаемся создать некоторые RESTful-сервисы с помощью Spring MVC. Мы будем предоставлять несколько представлений: XML, HTML и JSON. Мы хотели бы использовать JiBX в качестве технологии OXM.

В настоящее время нам сложно понять, как подключить Spring к JiBX. Если мы хотим подключить один класс, например Customer, мы просто определяем JibxMarshaller, XML MarshallingView и добавляем его также как ContentNegotiatingViewResolver. Это прекрасно работает.

Проблема в том, что мы не уверены, как подключить сортировку нескольких классов, например, Customer и User. Каждый JibxMarshaller может поддерживать только один класс (в отличие от Jaxb2Marshaller, который может поддерживать много). Мы попытались объявить маршаллера для каждого класса, но MarshallingView поддерживает только одного маршаллера. Объявление нескольких MarshallingView s не работает (кажется, работает только первый).

Ваш совет приветствуется. Спасибо.

<bean class="org.springframework.web.servlet.view.ContentNegotiatingViewResolver">
    <property name="mediaTypes">
        <util:map>
            <entry key="xml" value="application/xml"/>
        </util:map>
    </property>
    <property name="defaultViews">
        <util:list>
            <bean class="org.springframework.web.servlet.view.xml.MarshallingView">
                <property name="marshaller" ref="userMarshaller"/>
            </bean>
            <bean class="org.springframework.web.servlet.view.xml.MarshallingView">
                <property name="marshaller" ref="customerMarshaller"/>
            </bean>
        </util:list>
    </property>
</bean>

<bean id="userMarshaller" class="org.springframework.oxm.jibx.JibxMarshaller">
    <property name="targetClass" value="com.mycompany.User"/>
</bean>
<bean id="customerMarshaller" class="org.springframework.oxm.jibx.JibxMarshaller">
    <property name="targetClass" value="com.mycompany.Customer"/>
</bean>

Обновление на основе ответа Ритеша ниже:

Оказывается, я был сброшен свойством targetClass JibxMarshaller. Я думал, что это означает, что маршаллер будет работать только для одного класса, однако, похоже, он просто использует целевой класс как способ найти все связанные привязки. Итак, решение состоит в том, чтобы использовать только одного маршаллера, используя произвольный целевой класс из вашего набора классов, для которого у вас есть привязки. Например:

<bean class="org.springframework.web.servlet.view.ContentNegotiatingViewResolver">
    <property name="mediaTypes">
        <util:map>
            <entry key="xml" value="application/xml"/>
        </util:map>
    </property>
    <property name="defaultViews">
        <util:list>
            <bean class="org.springframework.web.servlet.view.xml.MarshallingView">
                <property name="marshaller" ref="jibxMarshaller"/>
            </bean>
        </util:list>
    </property>
</bean>

<bean id="jibxMarshaller" class="org.springframework.oxm.jibx.JibxMarshaller">
    <property name="targetClass" value="com.mycompany.User"/>
</bean>

1 Ответ

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

Компилятор связывания JiBX добавляет поле JiBX_bindingList в файлы классов. Во время выполнения targetClass (любой скомпилированный класс с полем JiBX_bindingList) используется для построения BindingFactory. Это getMappedClasses() из IBindingFactory , который используется JibxMarshaller в поддерживает () метод для проверки, может ли маршаллер маршалировать класс.

Пожалуйста, также смотрите Использование JiBX во время выполнения .

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