2017-02-22 4 views
3

Ich versuche, eine Java AppEngine von Cloud Endpoints auf Cloud Endpoints Framework zu migrieren. Ie v1 bis v2.Google APIs Explorer, der keinen Zugriff auf Cloud Endpoints-V2-Methoden zulässt

Die Migration läuft einwandfrei, alle Endpunkte sind auf der neuen Instanz verfügbar. Und Entdeckung zeigt alle Methoden https://myapp.appspot.com/_ah/api/discovery/v1/apis

Aber wenn ich https://apis-explorer.appspot.com/apis-explorer für meine appengine Domain verwenden, während ich immer noch die API-Methoden sehen können, wenn ich sie nach unten bohren kann ich nicht mehr params bieten und sie auszuführen.

im App Engine Protokoll der Suche Ich sehe die folgende Classcast

Uncaught exception from servlet 
javax.servlet.UnavailableException: java.lang.ClassCastException: com.google.api.server.spi.config.AnnotationBoolean cannot be cast to com.google.api.server.spi.config.AnnotationBoolean 
    at org.mortbay.jetty.servlet.ServletHolder.makeUnavailable(ServletHolder.java:415) 
    at org.mortbay.jetty.servlet.ServletHolder.initServlet(ServletHolder.java:458) 
    at org.mortbay.jetty.servlet.ServletHolder.getServlet(ServletHolder.java:339) 
    at org.mortbay.jetty.servlet.ServletHolder.handle(ServletHolder.java:487) 
    at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1166) 
    at com.googlecode.objectify.cache.AsyncCacheFilter.doFilter(AsyncCacheFilter.java:58) 
    at com.googlecode.objectify.ObjectifyFilter.doFilter(ObjectifyFilter.java:48) 
    at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157) 
    at com.google.apphosting.utils.servlet.ParseBlobUploadFilter.doFilter(ParseBlobUploadFilter.java:125) 
    at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157) 
    at com.google.apphosting.runtime.jetty.SaveSessionFilter.doFilter(SaveSessionFilter.java:37) 
    at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157) 
    at com.google.apphosting.utils.servlet.JdbcMySqlConnectionCleanupFilter.doFilter(JdbcMySqlConnectionCleanupFilter.java:60) 
    at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157) 
    at com.google.apphosting.utils.servlet.TransactionCleanupFilter.doFilter(TransactionCleanupFilter.java:48) 
    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 com.google.apphosting.runtime.jetty.AppVersionHandlerMap.handle(AppVersionHandlerMap.java:257) 
    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 com.google.apphosting.runtime.jetty.RpcRequestParser.parseAvailable(RpcRequestParser.java:76) 
    at org.mortbay.jetty.HttpConnection.handle(HttpConnection.java:404) 
    at com.google.apphosting.runtime.jetty.JettyServletEngineAdapter.serviceRequest(JettyServletEngineAdapter.java:145) 
    at com.google.apphosting.runtime.JavaRuntime$RequestRunnable.dispatchServletRequest(JavaRuntime.java:559) 
    at com.google.apphosting.runtime.JavaRuntime$RequestRunnable.dispatchRequest(JavaRuntime.java:519) 
    at com.google.apphosting.runtime.JavaRuntime$RequestRunnable.run(JavaRuntime.java:489) 
    at com.google.tracing.TraceContext$TraceContextRunnable.runInContext(TraceContext.java:453) 
    at com.google.tracing.TraceContext$TraceContextRunnable$1.run(TraceContext.java:460) 
    at com.google.tracing.CurrentContext.runInContext(CurrentContext.java:293) 
    at com.google.tracing.TraceContext$AbstractTraceContextCallback.runInInheritedContextNoUnref(TraceContext.java:319) 
    at com.google.tracing.TraceContext$AbstractTraceContextCallback.runInInheritedContext(TraceContext.java:311) 
    at com.google.tracing.TraceContext$TraceContextRunnable.run(TraceContext.java:457) 
    at com.google.apphosting.runtime.ThreadGroupPool$PoolEntry.run(ThreadGroupPool.java:238) 
    at java.lang.Thread.run(Thread.java:745) 

, die zu den Versuchen zu übereinstimmen scheint auf die Methoden in API Explorer aufschlüsseln. Diese Fehler treten bei v1 von Cloud Endpoints nicht auf.

Der ClassCast impliziert, dass der AnnotationBoolen in 2 verschiedene Klassenlader geladen wurde. Ich spiele selbst nicht mit Classloadern, also nehme ich an, dass dies etwas Neues für Endpoints v2 ist. Was ändere ich, um den ClassCast zu vermeiden?

Unterstützt der API Explorer das Cloud Endpoints Framework nicht vollständig?

Gibt es einen zusätzlichen Schritt, um die Methodenausführung über den API Explorer für Cloud Endpoints Framework zu ermöglichen?

+0

ersetzen Dieser Fehler API Explorer in keinem Zusammenhang sieht. Verwenden Sie den Schnellstart oder Ihre eigene App? – saiyr

+0

Meine eigene App.Ich muss nicht wirklich einen alten Schnellstart migrieren. Ich vermute, dass die Migrationsanweisungen nicht korrekt sind, dass es sich nicht um ein API Explorer-Problem handelt. – William

+0

Gibt es eine innere Ausnahme? – saiyr

Antwort

3

Gemäß dem Cloud EndPoints Frameworks-Migrationshandbuch werden diese Maven-Ziele nicht mehr unterstützt.

     <goal>endpoints_get_discovery_doc</goal> 
         <goal>endpoints_get_client_lib</goal> 

Siehe https://cloud.google.com/appengine/docs/standard/java/endpoints/migrating

Es auch wie Sie brauchen, um

  1. hinzufügen Cloud Endpoints API-Management, um Ihre Anwendung aussieht. Siehe https://cloud.google.com/endpoints/docs/frameworks/java/adding-api-management
  2. Generieren Sie eine API-Konfigurationsdatei und stellen Sie sie VOR der Bereitstellung der App bereit. Siehe https://cloud.google.com/endpoints/docs/frameworks/java/test-deploy

  3. Client Libs generieren mit ...

Siehe https://cloud.google.com/endpoints/docs/frameworks/java/quickstart-frameworks-java

Schritt 1 bedeutet in etwa wie folgt auf Ihre web.xml hinzu:

<!-- 
    EndPoints management API. See https://cloud.google.com/endpoints/docs/frameworks/java/adding-api-management 
--> 
<filter> 
    <filter-name>endpoints-api-configuration</filter-name> 
    <filter-class>com.google.api.control.ServiceManagementConfigFilter</filter-class> 
</filter> 

<!-- 
    EndPoints management API. See https://cloud.google.com/endpoints/docs/frameworks/java/adding-api-management 
--> 
<filter> 
    <filter-name>endpoints-api-controller</filter-name> 
    <filter-class>com.google.api.control.extensions.appengine.GoogleAppEngineControlFilter</filter-class> 
    <init-param> 
     <param-name>endpoints.projectId</param-name> 
     <param-value>your-appengine-projectid</param-value> 
    </init-param> 
    <init-param> 
     <param-name>endpoints.serviceName</param-name> 
     <param-value>your-appengine-project-url.appspot.com</param-value> 
    </init-param> 
</filter> 

<filter-mapping> 
    <filter-name>endpoints-api-configuration</filter-name> 
    <servlet-name>EndpointsServlet</servlet-name> 
</filter-mapping> 
<filter-mapping> 
    <filter-name>endpoints-api-controller</filter-name> 
    <servlet-name>EndpointsServlet</servlet-name> 
</filter-mapping> 
0

Die ClassCastException, die Sie erlebt haben, ist aufgrund der alten SystemServiceServlet insae geladen d der neuen EndpointsServlet. Konfigurieren Sie Ihren web.xml

<servlet> 
    <servlet-name>SystemServiceServlet</servlet-name> 
    <servlet-class>com.google.api.server.spi.SystemServiceServlet</servlet-class> 
    ... 
</servlet> 
<servlet-mapping> 
    <servlet-name>SystemServiceServlet</servlet-name> 
    <url-pattern>/_ah/spi/*</url-pattern> 
</servlet-mapping> 

mit

<servlet> 
    <servlet-name>EndpointsServlet</servlet-name> 
    <servlet-class>com.google.api.server.spi.EndpointsServlet</servlet-class> 
    ... 
</servlet> 
<servlet-mapping> 
    <servlet-name>EndpointsServlet</servlet-name> 
    <url-pattern>/_ah/api/*</url-pattern> 
</servlet-mapping> 
Verwandte Themen