spring-cloud-alibaba官网Demo问题总结

在学习使用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接口没有出现错误。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,以下是一个基本的 Spring Cloud Alibaba 项目搭建代码: 1. 创建 Spring Boot 项目 使用 Spring Initializr 创建一个 Spring Boot 项目,选择相应的依赖和 Spring Boot 版本。 2. 添加 Spring Cloud Alibaba 的依赖 在 pom.xml 文件中添加 Spring Cloud Alibaba 的依赖: ```xml <!-- Spring Cloud Alibaba Core --> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-alibaba-dependencies</artifactId> <version>2.2.1.RELEASE</version> <type>pom</type> <scope>import</scope> </dependency> <!-- Nacos Config --> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId> </dependency> <!-- Nacos Discovery --> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> </dependency> <!-- Sentinel --> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId> </dependency> <!-- Seata --> <dependency> <groupId>io.seata</groupId> <artifactId>seata-all</artifactId> <version>1.3.0</version> </dependency> ``` 3. 配置 Nacos 注册中心 在 application.properties 或 application.yml 文件中添加 Nacos 注册中心的配置: ```yaml spring.application.name=spring-cloud-alibaba-demo spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848 ``` 4. 配置 Sentinel 熔断降级 在 application.properties 或 application.yml 文件中添加 Sentinel 熔断降级的配置: ```yaml spring.cloud.sentinel.transport.dashboard=localhost:8080 ``` 5. 配置 Seata 分布式事务 在 application.properties 或 application.yml 文件中添加 Seata 分布式事务的配置: ```yaml spring.cloud.alibaba.seata.tx-service-group=my_group spring.cloud.alibaba.seata.tx-service-mode=AT spring.cloud.alibaba.seata.root-config=nacos:127.0.0.1:8848 ``` 6. 编写业务代码 根据自己的业务需求编写业务代码,并在代码中使用 Spring Cloud Alibaba 的组件,例如: ```java @RestController public class HelloController { @Autowired private DiscoveryClient discoveryClient; @GetMapping("/hello") public String hello() { List<String> services = discoveryClient.getServices(); return "Hello, " + services; } } ``` 以上就是一个基本的 Spring Cloud Alibaba 项目搭建代码。当然,根据具体的需求,还需要进行相应的调整。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值