如何在Vespa中添加自定义过滤器包以启用CORS?

时间:2018-12-20 08:10:47

标签: cors vespa

我遵循了问题Enable CORS in vespa,并使用RequestFilter和ResponseFilter编写并构建了一个新的自定义“ filter-bundle”包,其中添加了启用CORS的标头。这是我用于构建捆绑包的pom.xml文件

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>

  <groupId>com.yahoo.bundle</groupId>
  <artifactId>filter-bundle</artifactId>
  <version>1.0-SNAPSHOT</version>

  <dependencies>
    <dependency>
      <groupId>com.yahoo.vespa</groupId>
      <artifactId>container</artifactId>
      <version>6.297.80</version>
      <scope>provided</scope>
    </dependency>
  </dependencies>

  <build>
    <plugins>

      <plugin>
        <groupId>com.yahoo.vespa</groupId>
        <artifactId>vespa-application-maven-plugin</artifactId>
        <!-- Zip the application package -->
        <version>6.297.80</version>
        <executions>
          <execution>
            <goals>
              <goal>packageApplication</goal>
            </goals>
          </execution>
        </executions>
      </plugin>

      <plugin>
        <groupId>com.yahoo.vespa</groupId>
        <artifactId>bundle-plugin</artifactId>
        <version>6.297.80</version>
        <extensions>true</extensions>
        <configuration>
          <attachBundleArtifact>true</attachBundleArtifact>
          <bundleSymbolicName>filter-bundle</bundleSymbolicName>
          <bundleVersion>1.0.2</bundleVersion>
        </configuration>
      </plugin>

    </plugins>
  </build>



</project>

我将构建的jar捆绑包添加到“主”应用程序包的/ components目录中,并在链接https://docs.vespa.ai/documentation/jdisc/http-server-and-filters.html之后对我的services.xml文件进行了建议的更改 我在我的services.xml文件中添加了以下HTTP标记。

<http>
  <filtering>
    <filter id='request-filter' class='com.yahoo.bundle.MyRequestFilter' bundle="filter-bundle" />
    <filter id='response-filter' class='com.yahoo.bundle.MyResponseFilter' bundle="filter-bundle" />

    <request-chain id='request-chain'>
      <filter id='request-filter' />
      <binding>http://*/*</binding>
    </request-chain>

    <response-chain id='response-chain'>
      <filter id='response-filter' />
      <binding>http://*/*</binding>
    </response-chain>
  </filtering>
  <server port="8080" id="main-server" />
</http>

“ MyRequestFilter”和“ MyResponseFilter”是我的filter-bundle(位于application / components目录中内置的filter-bundle jar中)的类名。

执行以下步骤给我一个错误,即我的MANIFEST.MF文件中的过滤包jar文件中缺少一些标题,例如“ Bundle-SymbolicName”,“ Bundle-ManifestVersion”。因此,我编辑了MANIFEST.MF文件,在https://docs.vespa.ai/documentation/bundle-plugin.html之后添加了所需的标题 编辑1:添加“ container-plugin”行正确生成了MANIFEST.MF文件

但是,使用jar文件中的上述更改成功构建了我的应用程序之后,我仍然无法在我对Vespa的请求或响应中看到添加的标头,并且仍然收到错误消息,指出在大黄蜂类。

1 个答案:

答案 0 :(得分:3)

不需要手动编辑包清单,因为它是由包插件生成的。您目前正在构建一个普通的jar,而不是捆绑包。请在version标签下方的pom中添加以下内容:

<packaging>container-plugin</packaging>

现在它将作为捆绑包构建,并且清单将正确生成。

您可以删除vespa-application-maven-plugin,因为只需要使用services.xml等创建应用程序包即可。如果愿意,可以将过滤器类和您所使用的任何其他Java类一起放入主应用程序中可能会拥有,并完全跳过多余的捆绑包。