Вопрос

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

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

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

Ваш совет ценится. Спасибо.

<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>
Это было полезно?

Решение

Компилятор связывания Jibx добавляет JiBX_bindingList Поле в файлы класса. Во время выполнения, «TargetClass» (любой скомпилированный класс с JiBX_bindingList Поле) используется для построения BindingFactory. Это getMappedClasses() из Ibindingfactory который используется JibxMarshallerв поддержка () Метод, чтобы проверить, может ли Маршаллер маршал класс.

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top