{http://schemas.xmlsoap.org/soap/envelope/}Server.userException 错误解决
Posted tropica
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了{http://schemas.xmlsoap.org/soap/envelope/}Server.userException 错误解决相关的知识,希望对你有一定的参考价值。
AxisFault
faultCode: {http://schemas.xmlsoap.org/soap/envelope/}Server.userException
faultSubcode:
faultString: org.xml.sax.SAXException: Invalid element in com.ccur.DBWS.AccountService.ResultType - AdultEntitlement
faultActor:
faultNode:
faultDetail:
{http://xml.apache.org/axis/}stackTrace:org.xml.sax.SAXException: Invalid element in com.ccur.DBWS.AccountService.ResultType - AdultEntitlement
at org.apache.axis.encoding.ser.BeanDeserializer.onStartChild(BeanDeserializer.java:258)
at org.apache.axis.encoding.DeserializationContext.startElement(DeserializationContext.java:1035)
at org.apache.axis.message.SAX2EventRecorder.replay(SAX2EventRecorder.java:165)
at org.apache.axis.message.MessageElement.publishToHandler(MessageElement.java:1141)
at org.apache.axis.message.RPCElement.deserialize(RPCElement.java:236)
at org.apache.axis.message.RPCElement.getParams(RPCElement.java:384)
at org.apache.axis.client.Call.invoke(Call.java:2467)
at org.apache.axis.client.Call.invoke(Call.java:2366)
at org.apache.axis.client.Call.invoke(Call.java:1812)
at com.ccur.DBWS.AccountService.AccountServiceSoapStub.getAdultEntitlementData(AccountServiceSoapStub.java:289)
at com.ccur.DBWS.AccountService.AccountServiceSoapProxy.getAdultEntitlementData(AccountServiceSoapProxy.java:45)
at com.ccur.DBWS.AccountService.Test.main(Test.java:13)
这样的错误主要原因是:
解决:根据以上错误,到google搜索错误产生的原因和解决方案,发现遇到此问题的人不少,其并有人声称axis 1.2rc1已经解决了此bug。
然而,现时已经无法下载axis 1.4以下的版本,当前使用的是JBuilder自带的axis包,不清楚版本。升级到axis 1.2rc1的解决途径已经无望。
仔细查看已经搜索的解决方案,其中sun的论坛上一个帖子如此说:
This exception is because of the Java 5 XML parsing changes.
问题出现在xml的解析上。而以上错误的解析器使用的是weblogic.xml.jaxp.WebLogicSAXParser。
查找错误中org.apache.axis.encoding.DeserializationContextImpl类中的解析方法parse,其中一句:
SAXParser parser = XMLUtils.getSAXParser();
表明解析器的产生由XMLUtils.getSAXParser()获得。
而XMLUtils类中,初始化解析器工厂的方法:
static
{
log = LogFactory.getLog((class$org$apache$axis$utils$XMLUtils != null ? class$org$apache$axis$utils$XMLUtils : (class$org$apache$axis$utils$XMLUtils = class$("org.apache.axis.utils.XMLUtils"))).getName());
empty = new String("");
bais = new ByteArrayInputStream(empty.getBytes());
initSAXFactory(null, true, false);
}
其中,initSAXFactory方法:
public static void initSAXFactory(String factoryClassName, boolean namespaceAware, boolean validating)
{
if(factoryClassName != null)
try
{
saxFactory = (SAXParserFactory)Class.forName(factoryClassName).newInstance();
if(System.getProperty("javax.xml.parsers.SAXParserFactory") == null)
System.setProperty("javax.xml.parsers.SAXParserFactory", factoryClassName);
}
catch(Exception e)
{
log.error(Messages.getMessage("exception00"), e);
saxFactory = null;
}
else
saxFactory = SAXParserFactory.newInstance();
saxFactory.setNamespaceAware(namespaceAware);
saxFactory.setValidating(validating);
saxParsers.clear();
}
从以上代码看出,axis的XMLUtils类取得解析器工厂的过程为:
SAXParserFactory.newInstance()
该方法的解释:
newInstance
public static SAXParserFactory newInstance()
获取 SAXParserFactory 的一个新实例。此静态方法创建一个新的工厂实例,此方法使用下面有序的查找过程来确定要加载的 SAXParserFactory 实例类:
* 使用 javax.xml.parsers.SAXParserFactory 系统属性。
* 使用 JRE 文件夹中的属性文件 "lib/jaxp.properties"。此配置文件格式为标准的 java.util.Properties 且包含实现类的完全限定名,其中实现类的键是上述定义的系统属性。 JAXP 实现只读取一次 jaxp.properties 文件,然后缓存其值供以后使用。如果首次尝试读取文件时,文件不存在,则不会再次尝试检查该文件是否存在。首次读取 jaxp.properties 后,其中的属性值不能再更改。
* 如果可以,使用 Services API(在 JAR 规范中进行了详细描述)来确定类名称。Services API 将查找在运行时可用的 jar 中 META-INF/services/javax.xml.parsers.SAXParserFactory 文件中的类名。
* 平台默认的 SAXParserFactory 实例。
在应用程序获取对 SAXParserFactory 的引用后,它可以使用工厂来配置和获取解析器实例。
根源在此,将系统属性vax.xml.parsers.SAXParserFactory设置为org.apache.xerces.jaxp.SAXParserFactoryImpl(不使用weblogic的解析器工厂)
运行后,一切正常了。
结论:axis低版本在jdk5中使用时,要使用旧版的xml解析器工厂。
以上是关于{http://schemas.xmlsoap.org/soap/envelope/}Server.userException 错误解决的主要内容,如果未能解决你的问题,请参考以下文章