create()在jdk和android上的不同行为?
我已经在桌面上创建了webservice(jdk,运行良好),我正在尝试将其移动到android(使其在android设备上运行)。但我遇到了一些问题,经过几天的调试,我发现下一个代码的行为有所不同:create()在jdk和android上的不同行为?,android,xml,web-services,cxf,Android,Xml,Web Services,Cxf,我已经在桌面上创建了webservice(jdk,运行良好),我正在尝试将其移动到android(使其在android设备上运行)。但我遇到了一些问题,经过几天的调试,我发现下一个代码的行为有所不同: Schema Schema=TXW.create(Schema.class,ResultFactory.createSerializer(result)) 传递的result对象在调用之前几乎为空,并且只有systemId属性。在JDK上创建的模式没有nullnsUri属性,但在Android上它
Schema Schema=TXW.create(Schema.class,ResultFactory.createSerializer(result))代码>
传递的result
对象在调用之前几乎为空,并且只有systemId
属性。在JDK上创建的模式没有nullnsUri
属性,但在Android上它只是空的
JDK:
安卓:
原因是什么?我该如何解决?
它使架构无效,并在以后的cxf中引发异常:
javax.xml.ws.WebServiceException: java.lang.RuntimeException: Invalid schema document passed to AbstractDataBinding.addSchemaDocument, not in W3C schema namespace: schema
更新1:
我在android中找到了TXW
codepkg.getAnnotation(XmlNamespace.class)
returnnull
,但在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);
原因在于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";