アプリケーションは、JDK 8、Spring Boot、Spring Boot Jerseyスターターを使用し、WARとしてパッケージ化されています(ただし、Spring Boot Mavenプラグインを介してローカルで実行されます)。
私がやりたいことは、オンザフライで(ビルド時に)生成したドキュメントをウェルカムページとして取得することです。
私はいくつかのアプローチを試しました:
application.properties
で構成することにより静的コンテンツを提供させる 適切な初期化パラメーター 説明どおり ここmetadata-complete=false
web.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.properties
をspring.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);
}
}
最初に、静的コンテンツが提供されない理由は、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);
}
}
_
それでも機能しない場合は、@ 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
の差分アプローチを決定するのに役立ちました。
以下の設定は私のために働きました
セット
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を使用してください