2017-08-31 136 views
0
@RunWith(SpringRunner.class) 
@SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT) 
@Import({ JerseyConfig.class }) 
public class BenchApplicationTest { 

@Autowired 
private TestRestTemplate restTemplate; 

@Test 
public void contextLoads() { 

    ResponseEntity<String> entity = this.restTemplate.getForEntity("/bench/healthcheck", String.class); 
    assertThat(entity.getStatusCode()).isEqualTo(HttpStatus.OK); 

    } 

} 

我的應用程序執行完美,我能夠測試使用郵差 API來測試彈簧引導新澤西州的REST API。但是當我嘗試上述方法來執行測試用例來測試API時,它會給出以下錯誤。無法使用TestRestTemplate罐衝突

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'testRestTemplate': Initialization of bean failed; nested exception is java.lang.NoSuchFieldError: INSTANCE 
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:562) ~[spring-beans-4.3.4.RELEASE.jar:4.3.4.RELEASE] 
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:482) ~[spring-beans-4.3.4.RELEASE.jar:4.3.4.RELEASE] 
..... 
Caused by: java.lang.NoSuchFieldError: INSTANCE 
at org.apache.http.conn.ssl.SSLConnectionSocketFactory.<clinit>(SSLConnectionSocketFactory.java:144) ~[httpclient-4.5.2.jar:4.5.2] 
at org.apache.http.impl.client.HttpClientBuilder.build(HttpClientBuilder.java:962) ~[httpclient-4.5.2.jar:1.2.2] 

我試圖檢查這個錯誤,並且幾乎所有的人都認爲(這樣linklink)有我的應用程序是一個廣口瓶(HTTP客戶端/ HTTP核)的多個版本。我已經檢查過,並且在我的應用程序中沒有找到SSLConnectionSocketFactory的多個版本。如果所有的罐子都有衝突,我怎麼知道哪些是衝突的。我不手動添加jar,它是一個maven項目。我在過去的一週內遇到了這個問題,現在我正處於智慧結局之中。

請在下面找到我的pom.xml

<parent> 
    <groupId>org.springframework.boot</groupId> 
    <artifactId>spring-boot-starter-parent</artifactId> 
    <version>1.4.2.RELEASE</version> 
</parent> 
<dependencies> 
    <!-- Spring dependencies --> 
    <dependency> 
     <groupId>org.springframework.boot</groupId> 
     <artifactId>spring-boot-starter-jersey</artifactId> 
     <exclusions> 
      <exclusion> 
       <groupId>org.springframework.boot</groupId> 
       <artifactId>spring-boot-starter-tomcat</artifactId> 
      </exclusion> 
     </exclusions> 
    </dependency> 
    <dependency> 
     <groupId>org.springframework.boot</groupId> 
     <artifactId>spring-boot-starter-jetty</artifactId> 
    </dependency> 
    <dependency> 
     <groupId>org.springframework.boot</groupId> 
     <artifactId>spring-boot-starter-data-jpa</artifactId> 
    </dependency> 
    <dependency> 
     <groupId>org.springframework.boot</groupId> 
     <artifactId>spring-boot-starter-test</artifactId> 
    </dependency> 
    <dependency> 
     <groupId>org.springframework.boot</groupId> 
     <artifactId>spring-boot-configuration-processor</artifactId> 
     <optional>true</optional> 
    </dependency> 
    <dependency> 
     <groupId>org.springframework.boot</groupId> 
     <artifactId>spring-boot-starter-actuator</artifactId> 
    </dependency> 
    <dependency> 
     <groupId>com.sun.jersey</groupId> 
     <artifactId>jersey-json</artifactId> 
     <version>1.18.1</version> 
    </dependency> 
    <dependency> 
     <groupId>org.antlr</groupId> 
     <artifactId>antlr-complete</artifactId> 
     <version>3.5.2</version> 
    </dependency> 
    <dependency> 
     <groupId>com.zaxxer</groupId> 
     <artifactId>HikariCP</artifactId> 
    </dependency> 
    <dependency> 
     <groupId>commons-beanutils</groupId> 
     <artifactId>commons-beanutils</artifactId> 
    </dependency> 
    <dependency> 
     <groupId>org.apache.commons</groupId> 
     <artifactId>commons-lang3</artifactId> 
     <version>3.3.2</version> 
    </dependency> 
    <dependency> 
     <groupId>commons-collections</groupId> 
     <artifactId>commons-collections</artifactId> 
    </dependency> 
    <dependency> 
     <groupId>commons-validator</groupId> 
     <artifactId>commons-validator</artifactId> 
     <version>1.4.1</version> 
    </dependency> 

    <dependency> 
     <groupId>com.sun.jersey.contribs</groupId> 
     <artifactId>jersey-multipart</artifactId> 
     <version>1.19.3</version> 
    </dependency> 
    <dependency> 
     <groupId>net.sf.json-lib</groupId> 
     <artifactId>json-lib</artifactId> 
     <version>2.4</version> 
    </dependency> 
    <dependency> 
     <groupId>org.jsoup</groupId> 
     <artifactId>jsoup</artifactId> 
     <version>1.7.2</version> 
    </dependency> 
    <dependency> 
     <groupId>javax.servlet</groupId> 
     <artifactId>javax.servlet-api</artifactId> 
    </dependency> 
    <dependency> 
     <groupId>org.antlr</groupId> 
     <artifactId>antlr-complete</artifactId> 
     <version>3.5.2</version> 
    </dependency> 
    <dependency> 
     <groupId>com.rabbitmq</groupId> 
     <artifactId>amqp-client</artifactId> 
     <version>2.8.6</version> 
    </dependency> 
    <dependency> 
     <groupId>org.mockito</groupId> 
     <artifactId>mockito-all</artifactId> 
     <version>1.9.0</version> 
     <scope>test</scope> 
    </dependency> 
    <dependency> 
     <groupId>com.oracle</groupId> 
     <artifactId>ojdbc6</artifactId> 
     <version>11.2.0.4</version> 
    </dependency> 
    <dependency> 
     <groupId>org.owasp.esapi</groupId> 
     <artifactId>esapi</artifactId> 
     <version>2.1.0</version> 
    </dependency> 
    <dependency> 
     <groupId>com.sun.mail</groupId> 
     <artifactId>javax.mail</artifactId> 
    </dependency> 
    <dependency> 
     <groupId>org.freemarker</groupId> 
     <artifactId>freemarker</artifactId> 
    </dependency> 
    <dependency> 
     <groupId>org.apache.commons</groupId> 
     <artifactId>commons-jcs-jcache</artifactId> 
     <version>2.0-beta-1</version> 
    </dependency> 
    <dependency> 
     <groupId>org.reflections</groupId> 
     <artifactId>reflections</artifactId> 
     <version>0.9.9</version> 
    </dependency> 
    <dependency> 
     <groupId>com.codahale.metrics</groupId> 
     <artifactId>metrics-healthchecks</artifactId> 
     <version>3.0.1</version> 
    </dependency> 
    <dependency> 
     <groupId>com.googlecode.json-simple</groupId> 
     <artifactId>json-simple</artifactId> 
    </dependency> 
</dependencies> 

任何幫助,將不勝感激。

回答

1

快速回答

pom.xml的快速檢查表明,特別是依賴org.owasp.esapi:esapi翻出舊3.1版本的HttpClient。嘗試添加排除部分,這種依賴關係,如下所述。如果這沒有幫助,通過依賴關係樹相應

完整的答案

運行項目的根文件夾下以下命令工作

mvn dependency:tree -Dincludes=commons-httpclient 

,將打印項目的Maven的依賴關係樹全部拔掉例如:與神器編號commons-httpclient傳遞依賴關係,例如:

[INFO] your:project:jar:1.0-SNAPSHOT 
[INFO] \- org.owasp.esapi:esapi:jar:2.1.0:compile 
[INFO] \- org.owasp.antisamy:antisamy:jar:1.4.3:compile 
[INFO]  \- commons-httpclient:commons-httpclient:jar:3.1:compile 

比你能確定什麼是錯版httpclient在未來源(在我們的例子讓它成爲org.owasp.esapi:esapi),然後你可以通過修改你的pom.xml排除傳遞依賴含蓄:

 <dependency> 
      <groupId>org.owasp.esapi</groupId> 
      <artifactId>esapi</artifactId> 
      <version>2.1.0</version> 
      <!-- change starts here --> 
      <exclusions> 
       <exclusion> 
        <groupId>commons-httpclient</groupId> 
        <artifactId>commons-httpclient</artifactId> 
       </exclusion> 
      </exclusions> 
      <!-- change ends here --> 
     </dependency> 

注,您可能需要過濾使用通配符依賴關係樹像

mvn dependency:tree -Dincludes=*http* 

,或者通過簡單的樹輸出調用mvn dependency:tree沒有PARAMS

甚至工作終於可以帶d了明確要求增加對依賴具有發現和排除錯誤的版本,你的pom.xml的譴責以上:

<dependency> 
    <groupId>org.apache.httpcomponents</groupId> 
    <artifactId>httpclient</artifactId> 
    <version>4.5.2</version> 
</dependency> 

更新

由於問題不是由上面解決。方便的一段代碼,以確定所有的文件從classpath中加載:

ClassLoader cl = ClassLoader.getSystemClassLoader(); 

URL[] urls = ((URLClassLoader)cl).getURLs(); 

for(URL url: urls){ 
    System.out.println(url.getFile()); 
} 

你可以把它變成你的contextLoads()權利之前restTemplate呼叫,檢查/股的控制檯輸出呢?

+0

我遵循你的建議...我刪除了httpclient的其他傳遞關係,並按照你的建議顯式定義了httpclient ...但問題仍然存在..同樣的錯誤 –

+0

可能有一種情況是依賴關係不正確由於某種原因下載,這就是爲什麼排除可能不會被maven正確地獲取。請嘗試使用'mvn dependency:purge-local-repository'然後用'mvn clean buld'重新下載jar再次下載本地存儲庫(注意:它將完全刪除maven本地存儲庫!) – Kostiantyn

+0

順便說一下,能否請您仔細檢查沒有** IDE添加**依賴到您的測試類路徑?即通過IDE功能將一些JAR導入到您的項目中,而不是通過maven?一種全局庫或類似的東西 – Kostiantyn