【发布时间】:2017-02-06 08:24:47
【问题描述】:
在 karaf 4.0.3 中,XML 属性不通过 JAXB 解析。相同的应用程序适用于 Eclipse 内部 OSGI 容器,但适用于 karaf 容器。 两种情况都使用JDK7 JAXB实现。
任何想法为什么它会失败?
传入的 XML:
<?xml version="1.0" encoding="iso-8859-1"?>
<responsible version="1.0">
</responsible>
解析方法:
public void start(BundleContext bundleContext) throws Exception {
Activator.context = bundleContext;
ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);
scheduler.scheduleAtFixedRate(new Thread() {
public void run() {
try {
System.out.println("===============================================");
String name = "Responsible-response.xml";
Class<com.log4j2test.pojo.Responsible> baseClass = com.log4j2test.pojo.Responsible.class;
JAXBContext context = JAXBContext.newInstance(baseClass);
Unmarshaller u = context.createUnmarshaller();
final InputStream is = this.getClass().getResourceAsStream(name);
final InputStream is2 = this.getClass().getResourceAsStream(name);
String incomingXml = convertStreamToString(is2);
System.out.println("===Incoming XML: \n" + incomingXml);
StreamSource source = new StreamSource(is);
JAXBElement<?> unmarshaled = u.unmarshal(source, baseClass);
Object po = unmarshaled.getValue();
System.out.println("===Parsed POJO: " + po);
} catch (Throwable e) {
e.printStackTrace();
}
}
}, 5, 5, TimeUnit.SECONDS);
}
POJO:
@XmlRootElement(name = "responsible")
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "responsible", propOrder = { "version" })
public class Responsible {
@XmlAttribute(name = "version")
protected Double version;
public Double getVersion() {
return version;
}
public void setVersion(Double version) {
this.version = version;
}
@Override
public String toString() {
StringBuilder builder = new StringBuilder();
builder.append("Responsible [");
builder.append("version=");
builder.append(version);
builder.append("]");
return builder.toString();
}
KARAF 中的输出:
Eclipse 中的输出:
【问题讨论】:
-
将框架从 quinox 更改为 felix 解决了这个问题。需要了解为什么它会因 Equinox (karaf.framework=equinox) 而失败。
标签: eclipse jaxb osgi apache-karaf karaf