Внедрить JAXBContext в весну

Я пытаюсь внедрить JAXBContext в контекст приложения spring:

<bean id="jaxbContext" class="javax.xml.bind.JAXBContext" factory-method="newInstance">
  <constructor-arg type="java.lang.Class" value="com.package.MyClassName"/>
</bean>

Выдает исключение:

Соответствующий фабричный метод не найден: фабричный метод «newInstance»

И я также пытаюсь:

<bean id="jaxbContext" class="javax.xml.bind.JAXBContext" factory-method="newInstance">
  <constructor-arg type="java.lang.String" value="com.package"/>
</bean>

И он выдает исключение:

javax.xml.bind.JAXBException: «com.package» не содержит ObjectFactory.class или jaxb.index. Я поместил файл jaxb.index в пакет «com.package» и имеет в файле одну строку «MyClassName».


person yzandrew    schedule 22.03.2011    source источник
comment
Я могу использовать JAXBContext с помощью JAXBContext.newInstance(MyClassName.class); но не может вводить его таким же образом.   -  person yzandrew    schedule 22.03.2011


Ответы (3)


Ответ @Tomasz — это решение, которое я бы рекомендовал, но если вы хотите придерживаться JAXBContext, то причина, по которой ваш первый пример не удался, заключается в том, что static getInstance() для JAXBContext не принимает ни одного аргумента Class, он принимает их список vararg. Итак, вам нужно ввести список, а не один класс:

<bean id="jaxbContext" class="javax.xml.bind.JAXBContext" factory-method="newInstance">
  <constructor-arg value-type="java.lang.Class">
    <list>
       <value>com.package.MyClassName</value>
    </list>
  </constructor-arg>
</bean>
person skaffman    schedule 22.03.2011
comment
На самом деле getInstance() принимает один аргумент Class (см. docs), так что что-то вроде <constructor-arg><value type="java.lang.Class">com.package.MyClassName</value></constructor-arg> также будет работать. - person el.atomo; 27.03.2013

Вы пробовали Spring OXM? Последняя строка важна, пространства имен приведены только для справки:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:oxm="http://www.springframework.org/schema/oxm"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
    http://www.springframework.org/schema/oxm http://www.springframework.org/schema/oxm/spring-oxm-1.5.xsd">

    <oxm:jaxb2-marshaller id="marshaller" contextPath="com.package"/>
</beans>

См. 8.4. Конфигурация на основе схемы XML. Ю также понадобится spring-oxm в пути к классам.

person Tomasz Nurkiewicz    schedule 22.03.2011
comment
Привет, Томаш. Спасибо за ваш ответ. Я использую Spring 2.5, который не поддерживает OXM. Но это решение для тех, кто использует Spring 3.0 - person yzandrew; 22.03.2011
comment
Проблема с использованием пространства имен oxm заключается в том, что я не нашел способа внедрить свойства JAXBContext, например. для использования пользовательского Accessor для обработки компонентов Hibernate и пропуска ленивых отношений. - person pakman; 06.05.2011

это решит проблему с файлом jaxb.index или проблемой ObjectFactory в весенней среде. укажите значение пакета, в котором классы являются их, которые генерируют xml

введите код здесь`

    <bean id="marshaller" class="org.springframework.oxm.jaxb.Jaxb2Marshaller">
        <property name="packagesToScan" >
            <value>com.adarsh.spring.integration.entities</value>
        </property>
   </bean>`
person Adarsh Kumar    schedule 26.03.2015