Hi,
I am having a problem with the parsing of XML documents, using Xerces
for Java 2.6.2. I am having the problem inside of a war file in Sun
Application Server 8.2. It all runs on Windows XP SP2, under JRE
1.5.0_22. Updating to JRE 1.6 is not an option right now.
I have some code that validates XML documents against an XML Schema
in some code that services web service requests - that code is
deployed inside a war file. It was all previously working when I had
been using Axis 1 (JAX-RPC) for web services. When I switched to CXF
2.6.2 and JAX-WS, the xs:include schemaLocation="file" directives
began to fail. All XML Schema files are in the local filesystem.
Instead of looking for include files relative to the directory where
the including XML Schema file exists (as it had been doing), xerces
is now looking for the include file in a parent directory 2 levels up.
I tried to register an EntityResolver against the DocumentBuilder,
but it was nnever called back:
Document doc = null;
System.setProperty("javax.xml.parsers.DocumentBuilderFactory",
"org.apache.xerces.jaxp.DocumentBuilderFactoryImpl");
final DocumentBuilderFactory factory = DocumentBuilderFactory
.newInstance();
factory.setNamespaceAware(true);
factory.setValidating(true);
factory.setAttribute(
"http://java.sun.com/xml/jaxp/properties/schemaLanguage",
"http://www.w3.org/2001/XMLSchema");
factory.setAttribute(
"http://java.sun.com/xml/jaxp/properties/schemaSource",
xmlSchemaUrl);
final DocumentBuilder builder = factory.newDocumentBuilder();
builder.setEntityResolver(XmlSchemaEntityResolver.getSingleInstance());
final InputSource is = new InputSource(new
StringReader(xmlDoc));
doc = builder.parse(is);
// parse fails because includes fail ...
Then I read
http://xerces-j-users.markmail.org/message/2ze2qcwmmx3t253g?q=cxf
which said CXF might not be configuring JAXB correctly - it was an
old issue, but I thought it might be of some help to note here.
If I hardcode the absolute path, or modify the relative path,
everything works ok, but I have hundreds of schema files to work
with, and other applications use them as well, so changing them is
not really an option.
A sample stack backtrace is shown below. It is failing because the
'Header' element is unknown, and that is because the include that
loads the XML Schema file containing the 'Header' element definition
failed to get included. Note that I had to recompile xerces 2.6.2
with debug on, to get the line numbers shown below.
I have spent quite a bit of time trying to resolve this with no luck.
Does anyone have any ideas on what I need to configure or code to get
the XML Schema includes to look for the file specified by the
schemaLocation in a directory relative to the XML Schema file
containing the actual include directive ?
Thanks
Andrew
[#|2012-08-07T15:52:07.392+1000|INFO|sun-appserver-pe8.2|javax.enterprise.system.stream.out|_ThreadID=13;|2012-08-07
15:52:07,392 [httpWorkerThread-8080-2] DEBUG com.company.utils.xml.XmlHelper -
Stack Trace :
org.xml.sax.SAXParseException: cvc-complex-type.2.4.a: Invalid
content was found starting with element 'Header'. One of
'{"":GetDetails}' is expected.
at
org.apache.xerces.util.ErrorHandlerWrapper.createSAXParseException(ErrorHandlerWrapper.java:236)
at
org.apache.xerces.util.ErrorHandlerWrapper.error(ErrorHandlerWrapper.java:172)
at
org.apache.xerces.impl.XMLErrorReporter.reportError(XMLErrorReporter.java:380)
at
org.apache.xerces.impl.XMLErrorReporter.reportError(XMLErrorReporter.java:314)
at
org.apache.xerces.impl.xs.XMLSchemaValidator$XSIErrorReporter.reportError(XMLSchemaValidator.java:410)
at
org.apache.xerces.impl.xs.XMLSchemaValidator.reportSchemaError(XMLSchemaValidator.java:3114)
at
org.apache.xerces.impl.xs.XMLSchemaValidator.handleStartElement(XMLSchemaValidator.java:1758)
at
org.apache.xerces.impl.xs.XMLSchemaValidator.startElement(XMLSchemaValidator.java:686)
at
org.apache.xerces.impl.XMLNSDocumentScannerImpl.scanStartElement(XMLNSDocumentScannerImpl.java:320)
at
org.apache.xerces.impl.XMLDocumentFragmentScannerImpl$FragmentContentDispatcher.dispatch(XMLDocumentFragmentScannerImpl.java:1534)
at
org.apache.xerces.impl.XMLDocumentFragmentScannerImpl.scanDocument(XMLDocumentFragmentScannerImpl.java:338)
at
org.apache.xerces.parsers.XML11Configuration.parse(XML11Configuration.java:828)
at
org.apache.xerces.parsers.XML11Configuration.parse(XML11Configuration.java:758)
at org.apache.xerces.parsers.XMLParser.parse(XMLParser.java:148)
at org.apache.xerces.parsers.DOMParser.parse(DOMParser.java:248)
at
org.apache.xerces.jaxp.DocumentBuilderImpl.parse(DocumentBuilderImpl.java:215)
at com.company.utils.xml.XmlHelper.validateSchema(XmlHelper.java:98)
at com.company.ws.MyServiceImpl.GetDetails(MyServiceImpl.java:40)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:592)
at
org.apache.cxf.service.invoker.AbstractInvoker.performInvocation(AbstractInvoker.java:180)
at
org.apache.cxf.service.invoker.AbstractInvoker.invoke(AbstractInvoker.java:96)
at
org.apache.cxf.jaxws.AbstractJAXWSMethodInvoker.invoke(AbstractJAXWSMethodInvoker.java:178)
at
org.apache.cxf.jaxws.JAXWSMethodInvoker.invoke(JAXWSMethodInvoker.java:64)
at
org.apache.cxf.service.invoker.AbstractInvoker.invoke(AbstractInvoker.java:75)
at
org.apache.cxf.interceptor.ServiceInvokerInterceptor$1.run(ServiceInvokerInterceptor.java:58)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:417)
at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:269)
at java.util.concurrent.FutureTask.run(FutureTask.java:123)
at
org.apache.cxf.workqueue.SynchronousExecutor.execute(SynchronousExecutor.java:37)
at
org.apache.cxf.interceptor.ServiceInvokerInterceptor.handleMessage(ServiceInvokerInterceptor.java:107)
at
org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:262)
at
org.apache.cxf.transport.ChainInitiationObserver.onMessage(ChainInitiationObserver.java:122)
at
org.apache.cxf.transport.http.AbstractHTTPDestination.invoke(AbstractHTTPDestination.java:211)
at
org.apache.cxf.transport.servlet.ServletController.invokeDestination(ServletController.java:213)
at
org.apache.cxf.transport.servlet.ServletController.invoke(ServletController.java:193)
at
org.apache.cxf.transport.servlet.CXFNonSpringServlet.invoke(CXFNonSpringServlet.java:129)
at
org.apache.cxf.transport.servlet.AbstractHTTPServlet.handleRequest(AbstractHTTPServlet.java:187)
at
org.apache.cxf.transport.servlet.AbstractHTTPServlet.doPost(AbstractHTTPServlet.java:110)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:767)
at
org.apache.cxf.transport.servlet.AbstractHTTPServlet.service(AbstractHTTPServlet.java:166)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:592)
at org.apache.catalina.security.SecurityUtil$1.run(SecurityUtil.java:249)
at java.security.AccessController.doPrivileged(Native Method)
at javax.security.auth.Subject.doAsPrivileged(Subject.java:517)
at org.apache.catalina.security.SecurityUtil.execute(SecurityUtil.java:282)
at
org.apache.catalina.security.SecurityUtil.doAsPrivilege(SecurityUtil.java:165)
at
org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:257)
at
org.apache.catalina.core.ApplicationFilterChain.access$000(ApplicationFilterChain.java:55)
at
org.apache.catalina.core.ApplicationFilterChain$1.run(ApplicationFilterChain.java:161)
at java.security.AccessController.doPrivileged(Native Method)
at
org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:157)
at
org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:263)
at
org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:551)
at
org.apache.catalina.core.StandardContextValve.invokeInternal(StandardContextValve.java:225)
at
org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:173)
at
org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:551)
at
org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:170)
at
org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:551)
at
org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:132)
at
org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:551)
at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:933)
at org.apache.coyote.tomcat5.CoyoteAdapter.service(CoyoteAdapter.java:189)
at
com.sun.enterprise.web.connector.grizzly.ProcessorTask.doProcess(ProcessorTask.java:604)
at
com.sun.enterprise.web.connector.grizzly.ProcessorTask.process(ProcessorTask.java:475)
at
com.sun.enterprise.web.connector.grizzly.ReadTask.executeProcessorTask(ReadTask.java:371)
at
com.sun.enterprise.web.connector.grizzly.ReadTask.doTask(ReadTask.java:264)
at com.sun.enterprise.web.connector.grizzly.TaskBase.run(TaskBase.java:281)
at
com.sun.enterprise.web.connector.grizzly.WorkerThread.run(WorkerThread.java:83)
|#]