1. 程式人生 > 其它 >spring-cloud-alibaba官網Demo問題總結

spring-cloud-alibaba官網Demo問題總結

技術標籤:Spring Cloud Alibabaspring cloud alibabajavaspring

在學習使用spring-cloud-alibaba套件的時候,將遇到的問題進行總結。

gitbub上下載spring-cloud-alibaba的原始碼,執行其中的示例:spring-cloud-dubbo-provider-sample,啟動時沒有出錯,但是訪問rest介面時,後臺報錯:

java.lang.NoSuchMethodError: javax.ws.rs.core.HttpHeaders.getHeaderString(Ljava/lang/String;)Ljava/
lang/String; at org.jboss.resteasy.core.interception.PreMatchContainerRequestContext.getHeaderString(PreMatchContainerRequestContext.java:201) ~[resteasy-jaxrs-3.0.19.Final.jar:3.0.19.Final] at org.apache.dubbo.rpc.protocol.rest.RpcContextFilter.filter(RpcContextFilter.java:55) ~[dubbo-2.7.8.jar:2.7.8
] at org.jboss.resteasy.core.ResourceMethodInvoker.invokeOnTarget(ResourceMethodInvoker.java:263) ~[resteasy-jaxrs-3.0.19.Final.jar:3.0.19.Final] at org.jboss.resteasy.core.ResourceMethodInvoker.invoke(ResourceMethodInvoker.java:249) ~[resteasy-jaxrs-3.0.19.Final.jar:3.0.19.Final] at org.jboss.resteasy.
core.ResourceMethodInvoker.invoke(ResourceMethodInvoker.java:236) ~[resteasy-jaxrs-3.0.19.Final.jar:3.0.19.Final] ...

根據堆疊描述,用IDEA檢視PreMatchContainerRequestContext類的原始碼,發現出錯的程式碼如下:

@Override
   public String getHeaderString(String name)
   {
      return httpRequest.getHttpHeaders().getHeaderString(name);
   }

getHttpHeaders()方法的返回型別是javax.ws.rs.core.HttpHeaders,猜想應該是jar包衝突所致,該類屬於jsr311-api.jar

通過mvn dependency:tree命令,或IDEA的Maven Helper外掛,搜尋jsr311-api依賴關係,發現該jar是通過spring-cloud-starter-netflix-eureka-client依賴的。

[INFO] com.alibaba.cloud:spring-cloud-dubbo-provider-sample:jar:2.2.4.RELEASE
[INFO] \- org.springframework.cloud:spring-cloud-starter-netflix-eureka-client:jar:2.2.5.RELEASE:compile
[INFO]    +- com.netflix.eureka:eureka-client:jar:1.9.25:compile
[INFO]    |  +- javax.ws.rs:jsr311-api:jar:1.1.1:compile
[INFO]    |  \- com.sun.jersey:jersey-core:jar:1.19.1:compile
[INFO]    |     \- (javax.ws.rs:jsr311-api:jar:1.1.1:compile - omitted for duplicate)
[INFO]    \- com.netflix.eureka:eureka-core:jar:1.9.25:compile
[INFO]       \- (javax.ws.rs:jsr311-api:jar:1.1.1:compile - omitted for duplicate)

pom.xml中對其進行排除:

 <!-- Eureka Service Discovery -->
 <dependency>
     <groupId>org.springframework.cloud</groupId>
     <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
     <exclusions>
         <exclusion>
             <groupId>javax.ws.rs</groupId>
             <artifactId>jsr311-api</artifactId>
         </exclusion>
     </exclusions>
 </dependency>

重新啟動應用,訪問rest介面沒有出現錯誤。