【问题标题】:XML attributes are not parsed in karafkaraf 不解析 XML 属性
【发布时间】: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


【解决方案1】:

添加 javax.xml.bind 解决了问题:

karaf/etc/config.properties:
  org.osgi.framework.bootdelegation = \
    javax.xml.bind, \

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-27
    • 2010-11-02
    • 2010-11-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多