2013-05-30 105 views
1

我正在使用Google App Engine開發一個使用Web服務的Java示例應用程序。 當我在本地環境中工作時,一切正常,服務器服務部署在我的Google帳戶中,並且客戶端部署在本地環境中。FacesServlet在Google App Engine上使用Web服務時拒絕訪問

當我在Google App Engine上部署應用程序並嘗試執行它時,問題就出現了。當支持bean試圖創建服務器客戶端的一個實例發生異常:

這是例外,我得到:

javax.el.ELException: /home.xhtml at line 20 and column 64 action="#{bergeData.obtenerListado}": java.lang.ExceptionInInitializerError 

    Caused by: 
    java.security.AccessControlException - access denied ("java.lang.RuntimePermission" "getClassLoader") 
Caused by: java.lang.ExceptionInInitializerError 
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) 
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57) 
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) 
    at java.lang.reflect.Constructor.newInstance(Constructor.java:525) 
    at java.lang.Class.newInstance0(Class.java:370) 
    at java.lang.Class.newInstance(Class.java:323) 
    at javax.xml.ws.spi.FactoryFinder.newInstance(FactoryFinder.java:49) 
    at javax.xml.ws.spi.FactoryFinder.find(FactoryFinder.java:134) 
    at javax.xml.ws.spi.Provider.provider(Provider.java:127) 
    at javax.xml.ws.Service.<init>(Service.java:77) 
    at com.beeva.client.gen.AutomovilServerAPIService.<init>(AutomovilServerAPIService.java:46) 
    at com.beeva.controller.AutomovilServletClient.<init>(AutomovilServletClient.java:35) 
    at com.beeva.gae.BergeData.obtenerListado(BergeData.java:21) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:45) 
    at org.apache.el.parser.AstValue.invoke(AstValue.java:191) 
    at org.apache.el.MethodExpressionImpl.invoke(MethodExpressionImpl.java:276) 
    at org.apache.myfaces.view.facelets.el.TagMethodExpression.invoke(TagMethodExpression.java:83) 
    at javax.faces.component._MethodExpressionToMethodBinding.invoke(_MethodExpressionToMethodBinding.java:88) 
    at org.apache.myfaces.application.ActionListenerImpl.processAction(ActionListenerImpl.java:100) 
    at javax.faces.component.UICommand.broadcast(UICommand.java:120) 
    at javax.faces.component.UIViewRoot._broadcastAll(UIViewRoot.java:937) 
    at javax.faces.component.UIViewRoot.broadcastEvents(UIViewRoot.java:271) 
    at javax.faces.component.UIViewRoot._process(UIViewRoot.java:1249) 
    at javax.faces.component.UIViewRoot.processApplication(UIViewRoot.java:675) 
    at org.apache.myfaces.lifecycle.InvokeApplicationExecutor.execute(InvokeApplicationExecutor.java:34) 
    at org.apache.myfaces.lifecycle.LifecycleImpl.executePhase(LifecycleImpl.java:171) 
    at org.apache.myfaces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:118) 
    at javax.faces.webapp.FacesServlet.service(FacesServlet.java:189) 
    at org.mortbay.jetty.servlet.ServletHolder.handle(ServletHolder.java:511) 
    at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1166) 
    at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157) 
    at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157) 
    at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157) 
    at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157) 
    at org.mortbay.jetty.servlet.ServletHandler.handle(ServletHandler.java:388) 
    at org.mortbay.jetty.security.SecurityHandler.handle(SecurityHandler.java:216) 
    at org.mortbay.jetty.servlet.SessionHandler.handle(SessionHandler.java:182) 
    at org.mortbay.jetty.handler.ContextHandler.handle(ContextHandler.java:765) 
    at org.mortbay.jetty.webapp.WebAppContext.handle(WebAppContext.java:418) 
    at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:152) 
    at org.mortbay.jetty.Server.handle(Server.java:326) 
    at org.mortbay.jetty.HttpConnection.handleRequest(HttpConnection.java:542) 
    at org.mortbay.jetty.HttpConnection$RequestHandler.headerComplete(HttpConnection.java:923) 
    at org.mortbay.jetty.HttpConnection.handle(HttpConnection.java:404) 
    at com.google.tracing.TraceContext$TraceContextRunnable.runInContext(TraceContext.java:480) 
    at com.google.tracing.TraceContext$TraceContextRunnable$1.run(TraceContext.java:487) 
    at com.google.tracing.TraceContext.runInContext(TraceContext.java:774) 
    at com.google.tracing.TraceContext$DoInTraceContext.runInContext(TraceContext.java:751) 
    at com.google.tracing.TraceContext$AbstractTraceContextCallback.runInInheritedContextNoUnref(TraceContext.java:342) 
    at com.google.tracing.TraceContext$AbstractTraceContextCallback.runInInheritedContext(TraceContext.java:334) 
    at com.google.tracing.TraceContext$TraceContextRunnable.run(TraceContext.java:484) 
    ... 1 more 
Caused by: java.security.AccessControlException: access denied ("java.lang.RuntimePermission" "getClassLoader") 
    at com.google.appengine.runtime.Request.process-98b41701563e1bbd(Request.java) 
    at java.security.AccessControlContext.checkPermission(AccessControlContext.java:375) 
    at java.security.AccessController.checkPermission(AccessController.java:564) 
    at java.lang.SecurityManager.checkPermission(SecurityManager.java:549) 
    at java.lang.ClassLoader.getSystemClassLoader(ClassLoader.java:1479) 
    at com.sun.xml.bind.v2.model.nav.ReflectionNavigator.findClass(ReflectionNavigator.java:519) 
    at com.sun.xml.bind.v2.model.nav.ReflectionNavigator.findClass(ReflectionNavigator.java:58) 
    at com.sun.xml.bind.v2.model.impl.ModelBuilder.getClassInfo(ModelBuilder.java:249) 
    at com.sun.xml.bind.v2.model.impl.RuntimeModelBuilder.getClassInfo(RuntimeModelBuilder.java:100) 
    at com.sun.xml.bind.v2.model.impl.RuntimeModelBuilder.getClassInfo(RuntimeModelBuilder.java:81) 
    at com.sun.xml.bind.v2.model.impl.ModelBuilder.getClassInfo(ModelBuilder.java:209) 
    at com.sun.xml.bind.v2.model.impl.RuntimeModelBuilder.getClassInfo(RuntimeModelBuilder.java:95) 
    at com.sun.xml.bind.v2.model.impl.RuntimeModelBuilder.getClassInfo(RuntimeModelBuilder.java:81) 
    at com.sun.xml.bind.v2.model.impl.ModelBuilder.getTypeInfo(ModelBuilder.java:315) 
    at com.sun.xml.bind.v2.model.impl.TypeRefImpl.calcRef(TypeRefImpl.java:92) 
    at com.sun.xml.bind.v2.model.impl.TypeRefImpl.getTarget(TypeRefImpl.java:69) 
    at com.sun.xml.bind.v2.model.impl.RuntimeTypeRefImpl.getTarget(RuntimeTypeRefImpl.java:58) 
    at com.sun.xml.bind.v2.model.impl.RuntimeTypeRefImpl.getTarget(RuntimeTypeRefImpl.java:51) 
    at com.sun.xml.bind.v2.model.impl.ElementPropertyInfoImpl$1.get(ElementPropertyInfoImpl.java:74) 
    at com.sun.xml.bind.v2.model.impl.ElementPropertyInfoImpl$1.get(ElementPropertyInfoImpl.java:77) 
    at java.util.AbstractList$Itr.next(AbstractList.java:358) 
    at com.sun.xml.bind.v2.model.impl.ModelBuilder.getClassInfo(ModelBuilder.java:255) 
    at com.sun.xml.bind.v2.model.impl.RuntimeModelBuilder.getClassInfo(RuntimeModelBuilder.java:100) 
    at com.sun.xml.bind.v2.model.impl.RuntimeModelBuilder.getClassInfo(RuntimeModelBuilder.java:81) 
    at com.sun.xml.bind.v2.model.impl.ModelBuilder.getClassInfo(ModelBuilder.java:209) 
    at com.sun.xml.bind.v2.model.impl.RuntimeModelBuilder.getClassInfo(RuntimeModelBuilder.java:95) 
    at com.sun.xml.bind.v2.model.impl.RuntimeModelBuilder.getClassInfo(RuntimeModelBuilder.java:81) 
    at com.sun.xml.bind.v2.model.impl.ModelBuilder.getTypeInfo(ModelBuilder.java:315) 
    at com.sun.xml.bind.v2.model.impl.ModelBuilder.getTypeInfo(ModelBuilder.java:330) 
    at com.sun.xml.bind.v2.runtime.JAXBContextImpl.getTypeInfoSet(JAXBContextImpl.java:466) 
    at com.sun.xml.bind.v2.runtime.JAXBContextImpl.<init>(JAXBContextImpl.java:302) 
    at com.sun.xml.bind.v2.runtime.JAXBContextImpl$JAXBContextBuilder.build(JAXBContextImpl.java:1140) 
    at com.sun.xml.bind.v2.ContextFactory.createContext(ContextFactory.java:154) 
    at com.sun.xml.bind.v2.ContextFactory.createContext(ContextFactory.java:121) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:601) 
    at javax.xml.bind.ContextFinder.newInstance(ContextFinder.java:253) 
    at javax.xml.bind.ContextFinder.newInstance(ContextFinder.java:240) 
    at javax.xml.bind.ContextFinder.find(ContextFinder.java:440) 
    at javax.xml.bind.JAXBContext.newInstance(JAXBContext.java:637) 
    at javax.xml.bind.JAXBContext.newInstance(JAXBContext.java:584) 
    at com.sun.xml.ws.spi.ProviderImpl$2.run(ProviderImpl.java:220) 
    at com.sun.xml.ws.spi.ProviderImpl$2.run(ProviderImpl.java:218) 
    at java.security.AccessController.doPrivileged(AccessController.java:34) 
    at com.sun.xml.ws.spi.ProviderImpl.getEPRJaxbContext(ProviderImpl.java:217) 
    at com.sun.xml.ws.spi.ProviderImpl.<clinit>(ProviderImpl.java:88) 
    ... 55 more 
    ` 

異常的痕跡在這行代碼開始:

AutomovilServletClient clienteService = new AutomovilServletClient(); 

AutomovilServletClient具有初始化API服務構造:

public AutomovilServletClient() { 
     this.automovilAPI = new AutomovilServerAPIService().getAutomovilServerAPIPort(); 
    } 

首先去AutomovilServerAPIService的構造函數:

@WebServiceClient(name = "AutomovilServerAPIService", targetNamespace = "http://server.beeva.com/", wsdlLocation = "http://1.XXXX.appspot.com/AutomovilServerAPIService.wsdl") 
public class AutomovilServerAPIService 
    extends Service 
{ 

    private final static URL AUTOMOVILSERVERAPISERVICE_WSDL_LOCATION; 
    private final static Logger logger = Logger.getLogger(com.beeva.client.gen.AutomovilServerAPIService.class.getName()); 

    static { 
     URL url = null; 
     try { 
      URL baseUrl; 
      baseUrl = com.beeva.client.gen.AutomovilServerAPIService.class.getResource("."); 
      url = new URL(baseUrl, "http://1.XXXX.appspot.com/AutomovilServerAPIService.wsdl"); 
     } catch (MalformedURLException e) { 
      logger.warning("Failed to create URL for the wsdl Location: 'http://1.XXXX.appspot.com/AutomovilServerAPIService.wsdl', retrying as a local file"); 
      logger.warning(e.getMessage()); 
     } 
     AUTOMOVILSERVERAPISERVICE_WSDL_LOCATION = url; 
    } 

public AutomovilServerAPIService() { 
     super(AUTOMOVILSERVERAPISERVICE_WSDL_LOCATION, new QName("http://server.beeva.com/", "AutomovilServerAPIService")); 
    } 

} 

在方法AutomovilServerAPIService()是我失去跟蹤的執行。我檢查了常量AUTOMOVILSERVERAPISERVICE_WSDL_LOCATION的內容,它是正確的。

任何人都知道爲什麼它會在部署到Google App Engine時發生?

在此先感謝

UPDATE:嘗試SOAP example of Google Developers我發現,問題就來與使用Java服務器的Servlet的面孔。我的項目是一個具有JSF功能的Google Web應用程序項目。因此,這條線在web.xml是什麼原因造成的問題:

<servlet> 
    <servlet-name>Faces Servlet</servlet-name> 
    <servlet-class>javax.faces.webapp.FacesServlet</servlet-class> 
    </servlet> 
    <servlet-mapping> 
    <servlet-name>Faces Servlet</servlet-name> 
    <url-pattern>/faces/*</url-pattern> 
    <url-pattern>*.jsf</url-pattern> 
    </servlet-mapping> 

但是,我不知道如何解決它:(

更新2: 解決!!我有發現這個問題與Apache MyFaces JSF-Core 2.0不兼容。當通過properties/Project Facets添加JSF Capabilities時,選擇JSF 2.0(Mojarra 2.ZX-FCS)而不是Apache MyFaces

回答

0

我試過了在https://developers.google.com/appengine/articles/soap,它在本地和在線上都可以工作。

我在網上部署之前所作的改動:在SOAPService.java

  • 服務器應用在WSDL文件
  • 改網址,客戶端應用程序更改URL

我想你第二個變化已經完成了。

您可以確認在部署在線之前是否更新了WSDL文件?

<service name="TestSOAPService"> 
    <port name="TestSOAPPort" binding="tns:TestSOAPPortBinding"> 
    <soap:address location="**http://CHANGE_TO_ONLINEID.appspot.com**/testsoap"/> 
    </port> 
</service> 
+0

是的,服務器和客戶端都具有相同的WSDL文件位置值。但是,我沒有嘗試谷歌開發人員的例子。我會建立它,看看有沒有不同。感謝那 :) –

相關問題