2016-01-15 3 views
3

У меня есть приложение Spring Boot, которое я хотел бы добавить Spring Security. Поэтому я добавил следующую конфигурацию, которая начинается и работает просто отлично:Почему мой ApplicationContext не загружается при включении безопасности в Интернете?

@Configuration 
@EnableWebSecurity 
public class SecurityConfiguration extends WebSecurityConfigurerAdapter { 

    @Resource 
    private Environment environment; 

    @Bean 
    public PasswordEncoder passwordEncoder(){ 
     return new BCryptPasswordEncoder(); 
    } 

    @Override 
    protected void configure(HttpSecurity http) throws Exception { 
     if(environment.acceptsProfiles("live")) { 
      http.requiresChannel().anyRequest().requiresSecure(); 
     } 
     http.csrf().disable(); 
    } 
} 

Проблема заключается в том, что мои функциональные тесты не загрузить контекст приложения. Все функциональные тесты проходят от следующей конфигурации:

@ContextConfiguration(loader = SpringApplicationContextLoader.class, classes = MyConfiguration.class) 
@WebAppConfiguration 
@IntegrationTest 
class ContextInitializer extends GebReportingSpec { 
} 

Когда тесты пытается загрузить приложение, оно бросает следующую трассировку стеки:

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'defaultServletHandlerMapping' defined in class path resource [org/springframework/boot/autoconfigure/web/WebMvcAutoConfiguration$EnableWebMvcConfiguration.class]: Bean instantiation via factory method failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [org.springframework.web.servlet.HandlerMapping]: Factory method 'defaultServletHandlerMapping' threw exception; nested exception is java.lang.IllegalArgumentException: A ServletContext is required to configure default servlet handling 
    at org.springframework.beans.factory.support.ConstructorResolver.instantiateUsingFactoryMethod(ConstructorResolver.java:599) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateUsingFactoryMethod(AbstractAutowireCapableBeanFactory.java:1123) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1018) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:510) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:482) 
    at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:305) 
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230) 
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:301) 
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:196) 
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:772) 
    at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:835) 
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:537) 
    at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.refresh(EmbeddedWebApplicationContext.java:117) 
    at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:689) 
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:321) 
    at org.springframework.boot.test.SpringApplicationContextLoader.loadContext(SpringApplicationContextLoader.java:103) 
    at org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate.loadContextInternal(DefaultCacheAwareContextLoaderDelegate.java:98) 
    at org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate.loadContext(DefaultCacheAwareContextLoaderDelegate.java:116) 
    at org.springframework.test.context.support.DefaultTestContext.getApplicationContext(DefaultTestContext.java:83) 
    at org.springframework.test.context.support.DependencyInjectionTestExecutionListener.injectDependencies(DependencyInjectionTestExecutionListener.java:117) 
    at org.springframework.test.context.support.DependencyInjectionTestExecutionListener.prepareTestInstance(DependencyInjectionTestExecutionListener.java:83) 
    at org.springframework.test.context.TestContextManager.prepareTestInstance(TestContextManager.java:228) 
    at org.spockframework.spring.SpringTestContextManager.prepareTestInstance(SpringTestContextManager.java:49) 
    at org.spockframework.spring.SpringInterceptor.interceptSetupMethod(SpringInterceptor.java:42) 
    at org.spockframework.runtime.extension.AbstractMethodInterceptor.intercept(AbstractMethodInterceptor.java:28) 
    at org.spockframework.runtime.extension.MethodInvocation.proceed(MethodInvocation.java:87) 
    at org.spockframework.runtime.BaseSpecRunner.invoke(BaseSpecRunner.java:471) 
    at org.spockframework.runtime.BaseSpecRunner.runSetup(BaseSpecRunner.java:375) 
    at org.spockframework.runtime.BaseSpecRunner.runSetup(BaseSpecRunner.java:370) 
    at org.spockframework.runtime.BaseSpecRunner.doRunIteration(BaseSpecRunner.java:323) 
    at org.spockframework.runtime.BaseSpecRunner$6.invoke(BaseSpecRunner.java:309) 
    at org.spockframework.runtime.extension.MethodInvocation.proceed(MethodInvocation.java:88) 
    at org.spockframework.runtime.extension.builtin.AbstractRuleInterceptor$1.evaluate(AbstractRuleInterceptor.java:37) 
    at org.junit.rules.TestWatcher$1.evaluate(TestWatcher.java:55) 
    at org.spockframework.runtime.extension.builtin.TestRuleInterceptor.intercept(TestRuleInterceptor.java:38) 
    at org.spockframework.runtime.extension.MethodInvocation.proceed(MethodInvocation.java:87) 
    at org.spockframework.runtime.BaseSpecRunner.invoke(BaseSpecRunner.java:471) 
    at org.spockframework.runtime.BaseSpecRunner.runIteration(BaseSpecRunner.java:288) 
    at org.spockframework.runtime.BaseSpecRunner.initializeAndRunIteration(BaseSpecRunner.java:278) 
    at org.spockframework.runtime.BaseSpecRunner.runSimpleFeature(BaseSpecRunner.java:269) 
    at org.spockframework.runtime.BaseSpecRunner.doRunFeature(BaseSpecRunner.java:263) 
    at org.spockframework.runtime.BaseSpecRunner$5.invoke(BaseSpecRunner.java:246) 
    at org.spockframework.runtime.BaseSpecRunner.invokeRaw(BaseSpecRunner.java:480) 
    at org.spockframework.runtime.BaseSpecRunner.invoke(BaseSpecRunner.java:463) 
    at org.spockframework.runtime.BaseSpecRunner.runFeature(BaseSpecRunner.java:238) 
    at org.spockframework.runtime.BaseSpecRunner.runFeatures(BaseSpecRunner.java:188) 
    at org.spockframework.runtime.BaseSpecRunner.doRunSpec(BaseSpecRunner.java:98) 
    at org.spockframework.runtime.BaseSpecRunner$1.invoke(BaseSpecRunner.java:84) 
    at org.spockframework.runtime.BaseSpecRunner.invokeRaw(BaseSpecRunner.java:480) 
    at org.spockframework.runtime.BaseSpecRunner.invoke(BaseSpecRunner.java:463) 
    at org.spockframework.runtime.BaseSpecRunner.runSpec(BaseSpecRunner.java:76) 
    at org.spockframework.runtime.BaseSpecRunner.run(BaseSpecRunner.java:67) 
    at org.spockframework.runtime.Sputnik.run(Sputnik.java:63) 
    at org.gradle.api.internal.tasks.testing.junit.JUnitTestClassExecuter.runTestClass(JUnitTestClassExecuter.java:105) 
    at org.gradle.api.internal.tasks.testing.junit.JUnitTestClassExecuter.execute(JUnitTestClassExecuter.java:56) 
    at org.gradle.api.internal.tasks.testing.junit.JUnitTestClassProcessor.processTestClass(JUnitTestClassProcessor.java:64) 
    at org.gradle.api.internal.tasks.testing.SuiteTestClassProcessor.processTestClass(SuiteTestClassProcessor.java:50) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:497) 
    at org.gradle.messaging.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:35) 
    at org.gradle.messaging.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:24) 
    at org.gradle.messaging.dispatch.ContextClassLoaderDispatch.dispatch(ContextClassLoaderDispatch.java:32) 
    at org.gradle.messaging.dispatch.ProxyDispatchAdapter$DispatchingInvocationHandler.invoke(ProxyDispatchAdapter.java:93) 
    at com.sun.proxy.$Proxy2.processTestClass(Unknown Source) 
    at org.gradle.api.internal.tasks.testing.worker.TestWorker.processTestClass(TestWorker.java:106) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:497) 
    at org.gradle.messaging.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:35) 
    at org.gradle.messaging.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:24) 
    at org.gradle.messaging.remote.internal.hub.MessageHub$Handler.run(MessageHub.java:360) 
    at org.gradle.internal.concurrent.ExecutorPolicy$CatchAndRecordFailures.onExecute(ExecutorPolicy.java:54) 
    at org.gradle.internal.concurrent.StoppableExecutorImpl$1.run(StoppableExecutorImpl.java:40) 
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) 
    at java.lang.Thread.run(Thread.java:745) 
Caused by: org.springframework.beans.BeanInstantiationException: Failed to instantiate [org.springframework.web.servlet.HandlerMapping]: Factory method 'defaultServletHandlerMapping' threw exception; nested exception is java.lang.IllegalArgumentException: A ServletContext is required to configure default servlet handling 
    at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:189) 
    at org.springframework.beans.factory.support.ConstructorResolver.instantiateUsingFactoryMethod(ConstructorResolver.java:588) 
    ... 78 common frames omitted 
Caused by: java.lang.IllegalArgumentException: A ServletContext is required to configure default servlet handling 
    at org.springframework.util.Assert.notNull(Assert.java:115) 
    at org.springframework.web.servlet.config.annotation.DefaultServletHandlerConfigurer.<init>(DefaultServletHandlerConfigurer.java:53) 
    at org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport.defaultServletHandlerMapping(WebMvcConfigurationSupport.java:426) 
    at org.springframework.boot.autoconfigure.web.WebMvcAutoConfiguration$EnableWebMvcConfiguration$$EnhancerBySpringCGLIB$$4bbac173.CGLIB$defaultServletHandlerMapping$25(<generated>) 
    at org.springframework.boot.autoconfigure.web.WebMvcAutoConfiguration$EnableWebMvcConfiguration$$EnhancerBySpringCGLIB$$4bbac173$$FastClassBySpringCGLIB$$59db630c.invoke(<generated>) 
    at org.springframework.cglib.proxy.MethodProxy.invokeSuper(MethodProxy.java:228) 
    at org.springframework.context.annotation.ConfigurationClassEnhancer$BeanMethodInterceptor.intercept(ConfigurationClassEnhancer.java:318) 
    at org.springframework.boot.autoconfigure.web.WebMvcAutoConfiguration$EnableWebMvcConfiguration$$EnhancerBySpringCGLIB$$4bbac173.defaultServletHandlerMapping(<generated>) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:497) 
    at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:162) 
    ... 79 common frames omitted 

Кажется, что мне нужно, чтобы контекстный загрузчик теста Integration как-то знаю о весенней безопасности.

EDIT:

Я сузил проблему вниз к преобразователю, который тянет в PasswordEncoder. Извлечение конвертера и использование PasswordEncoder непосредственно в контроллере вызывает проблему. Кроме того, удаление Конфигурации безопасности позволит мне использовать конвертер просто отлично.

Вот ссылка на хранилище я сделал имитацией вопрос: https://github.com/StephenTurley/SpringBootSecurityTest.git

последней фиксации вызывает ошибку. Не знаю, почему я не могу использовать пружинные преобразователи и весеннюю безопасность. Есть идеи?

+0

В прошлом были проблемы с поддержкой Spock Spring. Вы пробовали это с простым JUnit? Кроме того, какую версию Spock вы используете? Здесь будет очень полезен [минимальный, полный и проверяемый пример] (http://stackoverflow.com/help/mcve). –

+0

Не пробовали junit, так как все наши функциональные тесты написаны в Spock/Jeb, и их переписывание менее чем идеально. Сказав это, сегодня я собираюсь создать небольшой проект, чтобы воспроизвести эту проблему. и опубликуйте его. Спасибо, что посмотрели. – ZeroDivide

+0

Я также должен добавить, что наши тесты работают нормально, когда отсутствует конфиг безопасности. – ZeroDivide

ответ

1

Я подозреваю, что это проблема с инициализацией, которая поддерживает fixed by adding DelegatingFilterProxy в Boot 1.3. Я отправил вам pull request, который устраняет проблему, обновив Spring Boot 1.3.2.RELEASE. Он также решает несколько других проблем зависимостей, которые у меня были.

0

Сталкивался с той же проблемой некоторое время назад и фиксировали его добавление javax.servlet-api и jsp-api в тест рамки, вы можете попробовать добавить те же зависимости, ниже для справки:

Для Maven:

<dependency> 
    <groupId>javax.servlet</groupId> 
    <artifactId>javax.servlet-api</artifactId> 
    <version>3.0.1</version> 
</dependency> 
<dependency> 
    <groupId>javax.servlet</groupId> 
    <artifactId>jsp-api</artifactId> 
    <version>2.0</version> 
</dependency> 

Для ливня:

testCompile "javax.servlet:javax.servlet-api:3.0.1" 
testCompile "javax.servlet:jsp-api:2.0" 

Также убедитесь, что у вас есть spring-test зависимость в область тестирования в вашем пути к классу.

+0

Без добавления этих зависимостей никаких изменений. – ZeroDivide

+0

@ZeroDivide: у вас есть зависимость spring-context (http://mvnrepository.com/artifact/org.springframework/spring-context) в вашем 'classpath'? – Arpit

+1

Я предполагаю, что втягивается транзитно из весеннего сапога. Я пишу небольшое примерное приложение, чтобы воспроизвести проблему сейчас. Не уверен, закончится ли я до конца обеденного перерыва. Я поделюсь репо, когда он будет завершен. – ZeroDivide

0

Я думаю, что в вас контексте приложения Шоул включают контекст безопасности, поэтому постарайтесь, чтобы добавить, что в вас контексте приложения:

@Configuration 
@Import({ 
    SecurityConfiguration.class 
}) 
@ComponentScan(basePackages = { 
    }) 
public class ApplicationContext { 
} 

Anothing, я думаю, SecurityConfiguration следует назвать SecurityContext.

0

я может отсутствовать некоторые контекстную информацию здесь, но вы пробовали:

@EnableAutoConfiguration(exclude = { DataSourceAutoConfiguration.class,WebMvcAutoConfiguration.class }) 

Может быть, один из ваших классов @Configuration помечается @EnableWebMvc ??

Смежные вопросы