没有为_am / api / discovery / * URL调用Servlet过滤器?

时间:2018-01-22 08:55:41

标签: web.xml servlet-filters google-cloud-endpoints-v2

我正在将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),而不是实现Google的漂亮API Explorer工具的_ah/api/discovery/* URL。 / p>

部署时不会抛出任何异常。

请注意,我已尝试将<url-pattern>/*</url-pattern>更改为<url-pattern>/_ah/api/*</url-pattern>,更改为<url-pattern>/_ah/api/discovery/*</url-pattern>,并使用<servlet-name>EndpointsServlet</servlet-name>而不是网址模式进行映射,但无效。

尴尬的是,同样的配置确实在星期五早上起作用,然后在下午晚些时候重新部署后停止了。而且我非常积极,我没有改变任何事情。

这是否已知行为?例如,这可能是因为API Explorer在外部“缝合”了端点URL而不是EndpointServlet本身的一部分?

否则,我做错了什么?

======

我通过将过滤器中的逻辑移动到ServletContextListener来修复此问题,这使得应用程序稳定。当然,这对于一次性for servlet-lifetime初始化是可行的,所以问题仍然存在:是否期望云API探测器触发在EndpointsServlet上注册的servlet过滤器?

0 个答案:

没有答案