Spring / Jaxb2Marshaller / MOXy не загружает сопоставления пространств имен package-info.java

Проблема

У меня странное поведение, когда Spring Jaxb2Marshaller не сканирует мой package-info.java. Может ли кто-нибудь взглянуть?

У меня есть приложение Spring MVC / Camel, которое принимает несколько объектов, заключенных в общую оболочку, где XML ДОЛЖЕН выглядеть так:

<mlf:message id="22" product="great.event" xmlns:mlf="special mlf URI">
    <mlf:header>
        <mlf:action value="notify-published"/>
    </mlf:header>
    <mlf:payload status="partial">
        <can be any element at all>
    </mlf:payload>
</mlf:message>

Моя установка следует за ошибкой.

Ошибка

-00: 00 [localhost-startStop-1] ОШИБКА osweb.context.ContextLoader Ошибка инициализации контекста org.springframework.beans.factory.BeanCreationException: ошибка при создании bean-компонента с именем 'jaxb2Marshaller', определенным в ресурсе пути к классу [com / company / CamelConfig .class]: не удалось вызвать метод инициализации; вложенное исключение

...

Исключение [EclipseLink-25016] (Eclipse Persistence Services - 2.5.1.v20130918-f2b9fc5): org.eclipse.persistence.exceptions.XMLMarshalException Описание исключения: пространство имен для заголовка префикса mlf: не найдено в преобразователе пространства имен.

  • со связанным исключением: [Exception [EclipseLink-0] (Eclipse Persistence Services - 2.5.1.v20130918-f2b9fc5): org.eclipse.persistence.exceptions.IntegrityException

в org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean (AbstractAutowireCapableBeanFactory.java:1553) ~ [spring-beans-4.0.1.RELEASE.jar: 4.0.1.RELEASE]

Настраивать

Мои классы package-info.java и Wrapper выглядят так:

package-info.java

@XmlSchema(
    xmlns={
        @XmlNs(prefix="mlf", namespaceURI="special mlf URI")
    },
    elementFormDefault=XmlNsForm.UNQUALIFIED)

package com.company.camel;
import javax.xml.bind.annotation.*;

Message.java

package com.company.camel;
@XmlRootElement(name = "message", namespace = "special mlf URI")
@XmlAccessorType(XmlAccessType.FIELD)
public class Message {

    @XmlAttribute(required = false)
    private int id;

    @XmlAttribute(namespace = "")
    private String product;

    @XmlAttribute(namespace = "", required = false)
    private String type;

    @XmlPath("flm:header/flm:action/@value")
    private String action;

    @XmlPath("flm:header/flm:notify-failure/@type")
    private String notifyFailureType;

    @XmlPath("flm:header/flm:notify-failure/@value")
    private String notifyFailureValue;

    @XmlPath("flm:payload")
    private Payload payload;

    //SNIP
}

Payload.java

package com.company.camel;
@XmlRootElement(name="payload", namespace="special mlf URI")
@XmlAccessorType(XmlAccessType.FIELD)
public class Payload {

    @XmlAttribute
    private String status;

    @XmlAnyElement(lax=true)
    Object body;

    //Getters&setters snipped
}  

Поскольку мне нужно демаршалировать этот класс из Spring MVC REST и Camel (нет, я не могу использовать Camel для REST), я настроил JAXB в Spring следующим образом:

@Configuration
@ComponentScan(basePackages="com.company.camel")
public class CamelConfig extends CamelConfiguration
{

    //SNIP

// The JAXBDataFormat is used inside Camel routes 
@Bean
public JaxbDataFormat jaxbDataFormat() {
    return new JaxbDataFormat(jaxb2Marshaller().getJaxbContext());
}

//used directly by Spring MVC
@Bean
public Jaxb2Marshaller jaxb2Marshaller() {
    Jaxb2Marshaller marshaller = new Jaxb2Marshaller();
    marshaller.setPackagesToScan(new String[]{"com.company"});
    return marshaller;
}

person cuttcards    schedule 21.03.2014    source источник


Ответы (1)


заметили, что у вас есть еще один вопрос без ответа ... мои соболезнования, устранение неполадок JAXB может быть проблемой. Не могли бы вы опубликовать весь проект?

У нас был большой проект Spring, в котором Spring загружал классы с аннотациями JAXB вместе с файлами package-info.java из импортированного JAR.

Затем другой разработчик добавил код для ручного вызова JAXBContext.newInstance для класса в том же пакете в качестве класса в импортированном JAR. Этого нового класса не было в импортированном JAR, новый класс находился в основном проекте. Кроме того, в основном проекте для этого пакета не было информации о пакете.

Вполне уверен, что исходное сопоставление пакетов JAXB из импортированного JAR было удалено и заменено.

Ищите любые дополнительные вызовы JAXB, которых там не должно быть.

person cuttcards    schedule 11.06.2014
comment
Так ... в этом была проблема? - person cuttcards; 11.06.2014