Я пытаюсь разработать приложение GWT, которое вызывает существующий (работающий) веб-сервис. Я использую:
- JAX-WS RI 2.1.6 in JDK 6
- JDK 6
- Glassfish V3
- Eclipse 20110615-0604
Я протестировал 3-компонентные приложения независимо друг от друга, и они отлично работают:
1. GWT application - browser invoking GWT server side code. This is based on the GWT sample, http://code.google.com/webtoolkit/gettingstarted.html#create
2. Java application that uses JAX-WS proxy to invoke a Web Service. This is based on a JAX-WS hello world sample. I used wsimport on my wsdl to generate the proxy code.
3. Pre-existing Web Service, which I have the WSDL for.
Когда я объединяю 2 верхних фрагмента кода, чтобы создать приложение GWT, которое вызывает веб-службу из кода на стороне сервера GWT, мое объединенное приложение завершается сбоем, за исключением следующего. Я подозреваю некоторый конфликт классов между стандартными зависимостями GWT и стандартными зависимостями JAX-WS.
Я получаю следующее исключение:
javax.servlet.ServletContext log: Исключение при отправке входящего вызова RPC
com.google.gwt.user.server.rpc.UnexpectedException: метод службы 'public abstract java.lang.String непредвиденное исключение: javax.xml.stream.FactoryFinder $ ConfigurationError: поставщик com.ctc.wstx.stax.WstxInputFactory не найден
на com.google.gwt.user.server.rpc.RPC.encodeResponseForFailure (RPC.java:385)
на com.google.gwt.user.server.rpc.RPC.invokeAndEncodeResponse (RPC.java:588)
на com.google.gwt.user.server.rpc.RemoteServiceServlet.processCall (RemoteServiceServlet.java:208)
на com.google.gwt.user.server.rpc.RemoteServiceServlet.processPost (RemoteServiceServlet.java:248)
на com.google.gwt.user.server.rpc.AbstractRemoteServiceServlet.doPost (AbstractRemoteServiceServlet.java:62)
на javax.servlet.http.HttpServlet.service (HttpServlet.java:637)
на javax.servlet.http.HttpServlet.service (HttpServlet.java:717)
в org.mortbay.jetty.servlet.ServletHolder.handle (ServletHolder.java:511)
в org.mortbay.jetty.servlet.ServletHandler $ CachedChain.doFilter (ServletHandler.java:1166)
на com.google.appengine.tools.development.HeaderVerificationFilter.doFilter (HeaderVerificationFilter.java:35)
в org.mortbay.jetty.servlet.ServletHandler $ CachedChain.doFilter (ServletHandler.java:1157)
на com.google.appengine.api.blobstore.dev.ServeBlobFilter.doFilter (ServeBlobFilter.java:58)
в org.mortbay.jetty.servlet.ServletHandler $ CachedChain.doFilter (ServletHandler.java:1157)
на com.google.apphosting.utils.servlet.TransactionCleanupFilter.doFilter (TransactionCleanupFilter.java:43)
в org.mortbay.jetty.servlet.ServletHandler $ CachedChain.doFilter (ServletHandler.java:1157)
на com.google.appengine.tools.development.StaticFileFilter.doFilter (StaticFileFilter.java:122)
в org.mortbay.jetty.servlet.ServletHandler $ CachedChain.doFilter (ServletHandler.java:1157)
на com.google.appengine.tools.development.BackendServersFilter.doFilter (BackendServersFilter.java:97)
в org.mortbay.jetty.servlet.ServletHandler $ CachedChain.doFilter (ServletHandler.java:1157)
на org.mortbay.jetty.servlet.ServletHandler.handle (ServletHandler.java:388)
в org.mortbay.jetty.security.SecurityHandler.handle (SecurityHandler.java:216)
в org.mortbay.jetty.servlet.SessionHandler.handle (SessionHandler.java:182)
на org.mortbay.jetty.handler.ContextHandler.handle (ContextHandler.java:765)
на org.mortbay.jetty.webapp.WebAppContext.handle (WebAppContext.java:418)
на com.google.apphosting.utils.jetty.DevAppEngineWebAppContext.handle (DevAppEngineWebAppContext.java:70)
на org.mortbay.jetty.handler.HandlerWrapper.handle (HandlerWrapper.java:152)
на com.google.appengine.tools.development.JettyContainerService $ ApiProxyHandler.handle (JettyContainerService.java:351)
на org.mortbay.jetty.handler.HandlerWrapper.handle (HandlerWrapper.java:152)
на org.mortbay.jetty.Server.handle (Server.java:326)
на org.mortbay.jetty.HttpConnection.handleRequest (HttpConnection.java:542)
в org.mortbay.jetty.HttpConnection $ RequestHandler.content (HttpConnection.java:938)
в org.mortbay.jetty.HttpParser.parseNext (HttpParser.java:755)
в org.mortbay.jetty.HttpParser.parseAvailable (HttpParser.java:218)на org.mortbay.jetty.HttpConnection.handle (HttpConnection.java:404)
на org.mortbay.io.nio.SelectChannelEndPoint.run (SelectChannelEndPoint.java:409)
в org.mortbay.thread.QueuedThreadPool $ PoolThread.run (QueuedThreadPool.java:582)
Вызвано: javax.xml.stream.FactoryFinder $ ConfigurationError: Поставщик com.ctc.wstx.stax.WstxInputFactory не найден
в javax.xml.stream.FactoryFinder.newInstance (FactoryFinder.java:154)
в javax.xml.stream.FactoryFinder.findJarServiceProvider (FactoryFinder.java:308)
в javax.xml.stream.FactoryFinder.find (FactoryFinder.java:233)
в javax.xml.stream.XMLInputFactory.newInstance (XMLInputFactory.java:123)
в com.sun.xml.internal.ws.api.streaming.XMLStreamReaderFactory.getXMLInputFactory (XMLStreamReaderFactory.java:98)
в com.sun.xml.internal.ws.api.streaming.XMLStreamReaderFactory. (XMLStreamReaderFactory.java:67)
в com.sun.xml.internal.ws.wsdl.parser.RuntimeWSDLParser.createReader (RuntimeWSDLParser.java:794)
в com.sun.xml.internal.ws.wsdl.parser.RuntimeWSDLParser.resolveWSDL (RuntimeWSDLParser.java:251)
в com.sun.xml.internal.ws.wsdl.parser.RuntimeWSDLParser.parse (RuntimeWSDLParser.java:118)
на com.sun.xml.internal.ws.client.WSServiceDelegate.parseWSDL (WSServiceDelegate.java:254)
на com.sun.xml.internal.ws.client.WSServiceDelegate. (WSServiceDelegate.java:217)
на com.sun.xml.internal.ws.client.WSServiceDelegate. (WSServiceDelegate.java:165)
в com.sun.xml.internal.ws.spi.ProviderImpl.createServiceDelegate (ProviderImpl.java:93)
на javax.xml.ws.Service. (Service.java:56)
at amx.devenvironment.helloworld1.JavaHelloComponent100201106212354ServiceHelloWorldPTHelloWorldPT. (JavaHelloComponent100201106212354ServiceHelloWorldPTHelloWorldPT.java:46)
at sample.HelloWorldGetResponse.getResponse (HelloWorldGetResponse.java:16)
на com.mjg.training.server.GreetingServiceImpl.greetServer (GreetingServiceImpl.java:46)
at sun.reflect.NativeMethodAccessorImpl.invoke0 (собственный метод)
at sun.reflect.NativeMethodAccessorImpl.invoke (NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke (DelegatingMethodAccessorImpl.java:25)
в java.lang.reflect.Method.invoke (Method.java:597)
на com.google.appengine.tools.development.agent.runtime.Runtime.invoke (Runtime.java:100)
на com.google.gwt.user.server.rpc.RPC.invokeAndEncodeResponse (RPC.java:569)
Ранее я получал это исключение:
[ERROR] javax.servlet.ServletContext log: Exception while dispatching incoming RPC call com.google.gwt.user.server.rpc.UnexpectedException: Service method 'public abstract java.lang.String com.mjg.training.client.GreetingService.greetServer(java.lang.String) throws java.lang.IllegalArgumentException' threw an unexpected exception: javax.xml.transform.TransformerFactoryConfigurationError: Provider org.apache.xalan.processor.TransformerFactoryImpl not found
at com.google.gwt.user.server.rpc.RPC.encodeResponseForFailure(RPC.java:385)
at com.google.gwt.user.server.rpc.RPC.invokeAndEncodeResponse(RPC.java:588)
Я решил это, добавив следующие строки в мой код:
System.setProperty("javax.xml.transform.TransformerFactory","com.sun.org.apache.xalan.internal.xsltc.trax.TransformerFactoryImpl");
Есть ли еще какие-нибудь аналогичные обходные пути для первого исключения.
Спасибо,
Matt.