我在桌面上创建了webservice(jdk,工作正常),我正在尝试将其移动到android(让它在Android设备上运行)。但是我遇到了一些问题,经过几天的调试后,我发现了下一个代码的不同行为:
Schema schema = TXW.create(Schema.class,ResultFactory.createSerializer(result));
传递result
对象在调用之前几乎为空,并且只有systemId
属性。在JDK上创建的模式没有null nsUri
属性,但在Android上它只是空的!
JDK:
机器人:
原因是什么,我该如何解决? 它使模式无效,并在以后的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);
答案 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";