TXW.create()在jdk和android上有不同的行为?

时间:2015-03-16 11:29:56

标签: android xml web-services cxf

我在桌面上创建了webservice(jdk,工作正常),我正在尝试将其移动到android(让它在Android设备上运行)。但是我遇到了一些问题,经过几天的调试后,我发现了下一个代码的不同行为:

Schema schema = TXW.create(Schema.class,ResultFactory.createSerializer(result));

传递result对象在调用之前几乎为空,并且只有systemId属性。在JDK上创建的模式没有null nsUri属性,但在Android上它只是空的!

JDK: enter image description here

机器人: enter image description here

原因是什么,我该如何解决? 它使模式无效,并在以后的cxf中抛出异常:

javax.xml.ws.WebServiceException: java.lang.RuntimeException: Invalid schema document passed to AbstractDataBinding.addSchemaDocument, not in W3C schema namespace: schema

UPDATE1:

我发现TXW代码pkg.getAnnotation(XmlNamespace.class)在android中返回null但在jdk中返回实例值:

if(nsUri.equals("##default")) {
            Package pkg = c.getPackage();
            if(pkg!=null) {
                XmlNamespace xn = pkg.getAnnotation(XmlNamespace.class); // xn = null in android
                if(xn!=null)
                    nsUri = xn.value();
            }
        }
        if(nsUri.equals("##default"))
            nsUri = "";

        return new QName(nsUri,localName);

1 个答案:

答案 0 :(得分:0)

原因在于TXW.java

Package pkg = c.getPackage();
XmlNamespace xn = pkg.getAnnotation(XmlNamespace.class);
if(xn!=null) // always null in android as it does not support package annotations
    nsUri = xn.value();

所以我不得不破解它 - 创建公共静态变量并在之前设置它:

public static java.lang.String XmlNamespaceAnnotationValue = null;
...
Package pkg = c.getPackage();
if(pkg!=null) {
    if (XmlNamespaceAnnotationValue != null) {
        nsUri = XmlNamespaceAnnotationValue;
    } else {
         XmlNamespace xn = pkg.getAnnotation(XmlNamespace.class);
         if(xn!=null)
             nsUri = xn.value();
    }
}

使用前:

TXW.XmlNamespaceAnnotationValue = "http://www.w3.org/2001/XMLSchema";