我正在将 GAE 应用程序更新到 Java8 Cloud SDK 环境;我也在更新它以使用 Cloud Endpoints 版本 2。
我的应用程序在其 web.xml 文件中注册了一些 servlet 过滤器,一个用于 Objectify,一个用于进行一些初始化,例如创建应用程序使用的某些实用程序类的单例实例。这是以下内容的摘录web.xml
:
<servlet>
<servlet-name>EndpointsServlet</servlet-name>
<servlet-class>com.google.api.server.spi.EndpointsServlet</servlet-class>
<init-param>
<param-name>services</param-name>
<param-value>com.myapp.service.Service</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>EndpointsServlet</servlet-name>
<url-pattern>/_ah/api/*</url-pattern>
</servlet-mapping>
<filter>
<filter-name>InitializerFilter</filter-name>
<filter-class>com.myapp.InitializerFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>InitializerFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<filter>
<filter-name>ObjectifyFilter</filter-name>
<filter-class>com.googlecode.objectify.ObjectifyFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>ObjectifyFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<!-- Add a filter that fetches the service config from service management. -->
<filter>
<filter-name>endpoints-api-configuration</filter-name>
<filter-class>com.google.api.control.ServiceManagementConfigFilter</filter-class>
</filter>
<!-- Add a filter that performs Endpoints logging and monitoring. -->
<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>${appId}</param-value>
</init-param>
<init-param>
<param-name>endpoints.serviceName</param-name>
<param-value>${service}-dot-${appId}.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>
看起来过滤器正确地启动了所有 URL(例如,由我实例化但未在此处显示的其他一些 servlet 处理的 URL),但不是_ah/api/discovery/*
实现 Google 漂亮的 APIs Explorer 工具的 URL。
部署时不会抛出异常。
请注意,我已经尝试使用而不是 URL 模式更改<url-pattern>/*</url-pattern>
to <url-pattern>/_ah/api/*</url-pattern>
、 to<url-pattern>/_ah/api/discovery/*</url-pattern>
和映射<servlet-name>EndpointsServlet</servlet-name>
,但无济于事。
尴尬的是,同样的配置在周五早上确实有效,然后在下午晚些时候重新部署后停止了。而且我很肯定我没有改变任何东西。
这是已知的行为吗?例如,这可能是因为 API Explorer 在外部“拼接”在端点 URL 上,而不是其EndpointServlet
自身的一部分?
否则,我做错了什么?
=========
我通过将过滤器中的逻辑移动到 ServletContextListener 来解决此问题,这使应用程序稳定。当然,这仅适用于 servlet-lifetime 初始化一次,所以问题仍然存在:云 API Explorer 是否有望触发 EndpointsServlet 上注册的 servlet 过滤器?