spring-cloud-alibaba官网Demo问题总结
在学习使用spring-cloud-alibaba套件的时候,将遇到的问题进行总结。
在上下载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接口没有出现错误。
