web-dev-qa-db-ja.com

Spring-Boot Jersey:Jerseyが静的コンテンツを提供できるようにします

アプリケーションは、JDK 8、Spring Boot、Spring Boot Jerseyスターターを使用し、WARとしてパッケージ化されています(ただし、Spring Boot Mavenプラグインを介してローカルで実行されます)。

私がやりたいことは、オンザフライで(ビルド時に)生成したドキュメントをウェルカムページとして取得することです。

私はいくつかのアプローチを試しました:

  1. ジャージーにapplication.propertiesで構成することにより静的コンテンツを提供させる 適切な初期化パラメーター 説明どおり ここ
  2. 生成されたHTMLドキュメントをウェルカムファイルとしてリストするために、metadata-complete=falseweb.xmlを導入します。

どれもうまくいきませんでした。

静的ファイルを提供するためだけに、Spring MVCを有効にしたり、Jerseyリソースを作成したりする必要はありません。

何か案が?

これがJersey構成クラスです(私はServletProperties.FILTER_STATIC_CONTENT_REGEXをそこに追加しようとして失敗しました):

@ApplicationPath("/")
@ExposedApplication
@Component
public class ResourceConfiguration extends ResourceConfig {

   public ResourceConfiguration() {
      packages("xxx.api");
      packages("xxx.config");
      property(ServerProperties.BV_DISABLE_VALIDATE_ON_EXECUTABLE_OVERRIDE_CHECK, true);
      property(ServerProperties.BV_SEND_ERROR_IN_RESPONSE, true);
   }
}

そして、ここにSpring Bootアプリケーションクラスがあります(application.propertiesspring.jersey.init.jersey.config.servlet.filter.staticContentRegex=/.*htmlで追加しようとしましたが、うまくいきませんでした。ここでプロパティキーが何であるか正確にわかりません):

@SpringBootApplication
@ComponentScan
@Import(DataConfiguration.class)
public class Application extends SpringBootServletInitializer {

    @Override
    protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
        return application.sources(Application.class);
    }

    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}
18
Rolf

最初に、静的コンテンツが提供されない理由は、Jerseyサーブレットのデフォルトのサーブレットマッピング(_/*_)が原因であり、すべてのリクエストを処理することです。したがって、静的コンテンツを提供するデフォルトのサーブレットには到達できません。以下のソリューションの他に、サーブレットマッピングを変更するだけのソリューションもあります。これを行うには、ResourceConfigサブクラスに@ApplicationPath("/another-mapping")の注釈を付けるか、_application.properties_プロパティ_spring.jersey.applicationPath_を設定します。


最初のアプローチについては、ジャージー ServletProperties をご覧ください。構成しようとしているプロパティは _FILTER_STATIC_CONTENT_REGEX_ です。それは述べています:

このプロパティは、Jerseyサーブレットコンテナがフィルタとして実行されるように構成されている場合にのみ適用されます。それ以外の場合、このプロパティは無視されます

Spring BootはデフォルトでJerseyサーブレットコンテナをサーブレットとして構成します(前述のように here ):

デフォルトでは、JerseyはServletRegistrationBeanという名前のjerseyServletRegistrationタイプの_@Bean_のサーブレットとして設定されます。同じ名前の独自のBeanを作成することにより、そのBeanを無効化またはオーバーライドできます。 _spring.jersey.type=filter_を設定することで、サーブレットの代わりにフィルタを使用することもできます(この場合、置換またはオーバーライドする_@Bean_はjerseyFilterRegistration)。

そのため、プロパティ_spring.jersey.type=filter_を_application.properties_に設定するだけで機能します。私はこれをテストしました。

参考までに、ジャージーに関する限り、サーブレットフィルターまたはサーブレットのどちらとして構成されていても、機能は同じです。

余談ですが、_FILTER_STATIC_CONTENT_REGEX_を使用するのではなく、すべての静的ファイルを処理するために複雑な正規表現を設定する必要がある場合は、 _FILTER_FORWARD_ON_404_ を使用できます。これは実際に私がテストに使用したものです。 ResourceConfigに設定します

_@Component
public class JerseyConfig extends ResourceConfig {

    public JerseyConfig() {
        packages("...");
        property(ServletProperties.FILTER_FORWARD_ON_404, true);
    }
}
_
31
Paul Samsotha

それでも機能しない場合は、@ peeskilletから提供された回答に従い、さらに変更を加える必要がありました。

以前、Application.Javaに次のメソッドを作成しました。

@Bean
public ServletRegistrationBean jerseyServlet() {
    ServletRegistrationBean registration = new ServletRegistrationBean(new ServletContainer(), "/*");
    registration.addInitParameter(ServletProperties.JAXRS_APPLICATION_CLASS, JerseyConfig.class.getName());
    return registration;
}

問題は、これにより/*パスのサーブレットが登録され、Jersey ResourceConfig構成ファイルがセットアップされたことです。

上記のメソッドを削除して@ConfigurationアノテーションをResourceConfigクラスに配置すると、Spring Bootを介して静的リソースを取得できることがわかりました。

完全を期すために、これは私のResourceConfigのスニペットです。

@Configuration
public class JerseyConfig extends ResourceConfig {
    public JerseyConfig() {
        // Application specific settings
        property(ServletProperties.FILTER_FORWARD_ON_404, true);
    }
}

このブログ投稿 は、ResourceConfigの差分アプローチを決定するのに役立ちました。

4
mnd

以下の設定は私のために働きました

セット

spring .jersey.type: filter

セット FILTER_FORWARD_ON_404

@Configuration 
        public class MyResourceConfig extends ResourceConfig  {

            public MyResourceConfig () {
                try {
                    register(XXX.class);
                    property(ServletProperties.FILTER_FORWARD_ON_404, true);

                } catch (Exception e) {
                    LOGGER.error("Exception: ", e);                   
                }
            }       

        } 

注:@ componentの代わりに@ Configurationを使用してください

1
Niraj Sonawane