0

我正在将 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 过滤器?

4

0 回答 0