Проблема
У меня странное поведение, когда 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;
}