web-dev-qa-db-ja.com

java.lang.IllegalArgumentException:デフォルトのサーブレット処理を設定するにはServletContextが必要です

次のテストクラスがあります。

@ActiveProfiles({ "DataTC", "test" })
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = {BaseTestConfiguration.class, DataTestConfiguration.class, JpaConfiguration.class, PropertyPlaceholderConfiguration.class })
public class RegularDayToTimeSlotsTest {
...

この問題は、BaseTestConfigurationクラスに起因するようです。

@Configuration
@ComponentScan(basePackages = { "com.bignibou" }, excludeFilters = { @Filter(type = FilterType.CUSTOM, value = RooRegexFilter.class),
        @Filter(type = FilterType.ANNOTATION, value = Controller.class), @Filter(type = FilterType.ANNOTATION, value = ControllerAdvice.class) })
public class BaseTestConfiguration {

}

私は体系的にこの例外を取得します:

Caused by: Java.lang.IllegalArgumentException: A ServletContext is required to configure default servlet handling
    at org.springframework.util.Assert.notNull(Assert.Java:112)
    at org.springframework.web.servlet.config.annotation.DefaultServletHandlerConfigurer.<init>(DefaultServletHandlerConfigurer.Java:54)
    at org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport.defaultServletHandlerMapping(WebMvcConfigurationSupport.Java:329)
    at org.springframework.web.servlet.config.annotation.DelegatingWebMvcConfiguration$$EnhancerByCGLIB$$bb4ceb44.CGLIB$defaultServletHandlerMapping$22(<generated>)
    at org.springframework.web.servlet.config.annotation.DelegatingWebMvcConfiguration$$EnhancerByCGLIB$$bb4ceb44$$FastClassByCGLIB$$368bb5c1.invoke(<generated>)
    at org.springframework.cglib.proxy.MethodProxy.invokeSuper(MethodProxy.Java:228)
    at org.springframework.context.annotation.ConfigurationClassEnhancer$BeanMethodInterceptor.intercept(ConfigurationClassEnhancer.Java:326)
    at org.springframework.web.servlet.config.annotation.DelegatingWebMvcConfiguration$$EnhancerByCGLIB$$bb4ceb44.defaultServletHandlerMapping(<generated>)
    at Sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at Sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.Java:57)
    at Sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.Java:43)
    at Java.lang.reflect.Method.invoke(Method.Java:606)
    at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.Java:166)
    ... 43 more

この問題を回避する方法がわかりません。どういうわけか、Springはテストを実行するときにServletContextを探していますが、上記の例外が発生します...

55
balteo

@Configurationクラスの1つには、明らかに@EnableWebMvcの注釈が付けられています。 DelegatingWebMvcConfigurationは、@EnableWebMvcによってimportedされるため、スタックトレースで終了する方法です。

したがって、thinkとはいえ、WebApplicationContext(したがってServletContext)は必要ありませんが、実際には@EnableWebMvcを使用してアプリケーションコンテキストをロードしているために必要です。

次の2つのオプションがあります。

  • Web関連の構成(つまり、@Configurationアノテーションが付けられた@EnableWebMvcクラス)が含まれないように、統合テストの構成クラスを作成します。
  • 上記の他のコメントで提案されているように、テストクラスに@WebAppConfigurationの注釈を付けます。

よろしく、

サム(Spring TestContext Frameworkの著者)

138
Sam Brannen

あなたが行方不明のようです

@WebAppConfiguration

テストクラスから。

ドキュメント 状態

リソースのベースパスはバックグラウンドで使用され、テストのWebApplicationContextのServletContextとして機能するMockServletContextを作成します。

通常、サーブレットコンテナはServletContextを提供します。テスト環境にいるため、偽物が必要です。 @WebAppConfigurationはそれを提供します。

37

サーブレットコンテキストをインスタンス化するには、アノテーションを使用する必要があります。

@WebAppConfiguration

統合テスト用にロードされたApplicationContextがWebApplicationContextであることを宣言するために使用されるクラスレベルの注釈。テストクラスに@WebAppConfigurationが存在するだけで、Webアプリケーションのルート(つまり、リソース)のパスに「file:src/main/webapp」のデフォルト値を使用して、テスト用にWebApplicationContextがロードされます。基本パス)。リソースのベースパスはバックグラウンドで使用され、テストのWebApplicationContextのServletContextとして機能するMockServletContextを作成します。

11
Hrishikesh

同様のエラーが発生していましたが、テストを実行しようとするのではなく、アプリケーションを正常に実行していました。

カスタムPermissionEvaluatorを使用している場合は、メインのSpringセキュリティ構成を持つクラスとは別の@Configurationクラスで宣言する必要があります。

参照: Spring Bootプロジェクトにメソッドベースのセキュリティを追加する方法

Githubの未解決の問題もあります: https://github.com/spring-projects/spring-boot/issues/4875

0
Robert Hunt