我遇到了一些奇怪的行为: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]错误o.s.web.context.ContextLoader上下文初始化失败 org.springframework.beans.factory.BeanCreationException:创建类路径资源[com / company / CamelConfig.class]中定义的名为'jaxb2Marshaller'的bean时出错:init方法的调用失败;嵌套异常是
...
异常[EclipseLink-25016](Eclipse Persistence Services - 2.5.1.v20130918-f2b9fc5):org.eclipse.persistence.exceptions.XMLMarshalException 异常说明:在命名空间解析程序中找不到前缀mlf:header的命名空间。
at 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 for REST),我在Spring中设置了JAXB:
@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;
}
答案 0 :(得分:0)
注意到你有另一个未得到回答的问题......我的哀悼,JAXB可能很难排除故障。你可以发布整个项目吗?
我们有一个大型的Spring项目,其中Spring从导入的JAR加载了带有package-info.java文件的JAXB注释类。
然后,另一位开发人员添加了代码,以便在导入的JAR中作为类中的类 在同一个包 中手动调用JAXBContext.newInstance。这个新类不在导入的JAR中,新类在主项目中。 此外,该软件包的主项目中没有package-info。
非常确定来自导入的JAR的原始JAXB包映射正在被吹走并被替换。
查找不应该对JAXB的任何其他调用。