2016-09-13 3 views
0

Я использую Spring Boot 1.4, Spock и Spring-boot-starter-security. Вот мой отношение Gradle файл:Интеграция Spring Boot не запускается из-за TestRestTemplate и apache SSL

springBootVersion = '1.4.0.BUILD-SNAPSHOT' 
classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}") 
compile('org.springframework.boot:spring-boot-starter-data-jpa') 
compile('org.springframework.boot:spring-boot-devtools') 
compile('org.springframework.boot:spring-boot-starter-security') 
compile('org.springframework.boot:spring-boot-starter-web') 
compile('org.jasypt:jasypt-spring31:1.9.2') 
compile('org.apache.httpcomponents:httpclient:4.5.2') 
testCompile('org.springframework.boot:spring-boot-starter-test') 
testCompile('org.spockframework:spock-core:1.1-groovy-2.4-rc-2') 
testCompile('org.spockframework:spock-spring:1.1-groovy-2.4-rc-2') 

Я также добавил это к моему application-test.properties файла:

server.ssl.enabled=false 
spring.datasource.username=test 
spring.datasource.password=test 
spring.datasource.url=jdbc:h2:mem:testdb 
spring.datasource.driverClassName=org.h2.Driver 

Я был в состоянии создать аутентификацию конечной точки, которая создает JWT (используя jasypt -spring31: 1.9.2) и возвращает его в заголовке авторизации. Это отлично работает при доступе через браузер или почтальон. Тем не менее, я не смог выполнить эту работу в своем Тесте интеграции Spring Boot.

У меня есть класс конфигурации БД, так как мой пароль зашифрован:

@Configuration 
public class DBConfig { 

    @Autowired 
    private Environment env; 

    @Value("${spring.datasource.driverClassName}") 
    private String databaseDriverClassName; 

    @Value("${spring.datasource.url}") 
    private String datasourceUrl; 

    @Value("${spring.datasource.username}") 
    private String databaseUsername; 

    @Value("${jasypt.key}") 
    private String jasyptKey; 

    @Bean 
    public DataSource datasource() throws IOException { 

     return DataSourceBuilder 
         .create() 
         .username(databaseUsername) 
         .password(getSecurePassword()) 
         .url(datasourceUrl) 
         .driverClassName(databaseDriverClassName) 
         .build(); 
    } 

    private String getSecurePassword() throws IOException { 
     StandardPBEStringEncryptor encryptor = new StandardPBEStringEncryptor(); 
     encryptor.setPassword(jasyptKey); 
     Properties props = new EncryptableProperties(encryptor); 
     props.load(this.getClass().getClassLoader().getResourceAsStream("application-" + env.getActiveProfiles()[0] + ".properties")); 
     return props.getProperty("spring.datasource.password"); 
    } 
} 

Мой базовый класс тестирования запускается встроенный экземпляр Tomcat и сделать все конечные точки доступны, и есть метод, чтобы получить JWT:

@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT) 
@TestPropertySource("classpath:application-test.properties") 
class BaseSpecification extends Specification { 

    @Autowired 
    def TestRestTemplate restTemplate 

    String loginAndGetJWT() { 

     def model = new ModelMap(); 
     model.addAttribute("username", "ausername") 
     model.addAttribute("password", "apassword"); 

     ResponseEntity<JwtAuthenticationResponse> response = restTemplate.getForEntity("/auth", String.class, model); 
     def jwt = response.getBody().token 

     return jwt; 
    } 
} 

Когда я пытаюсь запустить мой образец теста:

class ApplicationSpecWithoutAnnotation extends BaseSpecification { 

    @Autowired 
    WebApplicationContext context 

    def "should boot up without errors"() { 

     expect: "web application context exists" 
     context != null 
    } 
} 

я получаю т он следующее:

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'testRestTemplate': Initialization of bean failed; nested exception is java.lang.NoClassDefFoundError: Could not initialize class org.apache.http.conn.ssl.SSLConnectionSocketFactory 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:553) ~[spring-beans-4.3.2.RELEASE.jar:4.3.2.RELEASE] 

По this: TestRestTemplate теперь доступен как боб, когда @SpringBootTest используется.

Если удалить компиляции ('org.apache.httpcomponents: HttpClient: 4.5.2') затем изменяется ошибка в:

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'testRestTemplate': Initialization of bean failed; nested exception is java.lang.NoClassDefFoundError: org/apache/http/impl/client/HttpClients 

Так что, как представляется, зависимость от Spring Web & апача это не кажется правильным.

+0

Я думаю, что вам не нужен 'httpclient' как явная зависимость, ваша ошибка указывает на проблему при инициализации класса (см. Эту [link] (https://stackoverflow.com/questions/1457863/what-causes -and-what-are-the-difference-between-noclassdeffounderror-and-classn) для объяснения 'NoClassDefFoundError'). Какую версию JDK вы используете? Вы также можете попытаться установить 'server.ssl.enabled = false' значение' true' или просто опустить ключ конфигурации. –

+0

У меня на самом деле есть server.ssl.enabled = false и я использую JDK1.8. Когда я удаляю строку «компилировать (« org.apache.httpcomponents: httpclient: 4.5.2 ») из моего build.gradle, я все равно получаю ошибку: вызвано: java.lang.NoClassDefFoundError: org/apache/http/impl/клиент/HttpClients. Интересно, это проблема градиента, потому что все весенние примеры, которые я основывал на этом, находятся в maven? – sonoerin

+0

Я не думаю, что это проблема Gradle. Можете ли вы опубликовать небольшой пример проекта, демонстрирующий вашу проблему в Github? –

ответ

1

Оказывается, мои включенные библиотеки QBO имели оскорбительную http-библиотеку. Я удалил все ссылки на эту библиотеку 2.5, и моя сборка была исправлена. Не уверен, почему он не появился в моем дереве зависимостей gradle, но когда я посмотрел на импортированные банки, я нашел его.

+0

У меня такая же проблема, как вы видите импортированные банки? Я использую Maven Btw. –

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