Spring boot项目整合webservice后,引入阿里云短信包,项目启动报错。
问题描述:
最近一个老项目发送短信的接口需要由网易换成阿里云的,本来其它项目引入都没什么问题,但这个项目之前使用cxf整合过webservice,导入阿里的jar包后,项目启动报错
Error creating bean with name ‘endpoint’ defined in class path resource [ct/edu/lms/web/server/config/CxfConfig.class]: Bean instantiation via factory method failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [javax.xml.ws.Endpoint]: Factory method ‘endpoint’ threw exception; nested exception is javax.xml.ws.WebServiceException:
完整截图:
引入的包:
//cxf
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web-services</artifactId>
<version>2.1.4.RELEASE</version>
</dependency>
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-rt-frontend-jaxws</artifactId>
<version>3.1.6</version>
</dependency>
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-rt-transports-http</artifactId>
<version>3.1.6</version>
</dependency>
//阿里云短信
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>aliyun-java-sdk-core</artifactId>
<version>4.1.0</version>
</dependency>
原因分析、解决:
报错大概是因为cxf包和阿里云的包中某个xml解析包冲突了,其中有个com.sun.xml.bind是阿里云中的,于是尝试使用exclusions去掉不想要的包,项目启动正常。代码如下:
<!-- 阿里云短信 -->
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>aliyun-java-sdk-core</artifactId>
<version>4.1.0</version>
<exclusions>
<exclusion>
<groupId>com.sun.xml.bind</groupId>
<artifactId>jaxb-core</artifactId>
</exclusion>
<exclusion>
<groupId>com.sun.xml.bind</groupId>
<artifactId>jaxb-impl</artifactId>
</exclusion>
</exclusions>
</dependency>
后续
本以为项目启动不报错就可以了,但短信发送不了!只能继续找原因,到官网查看,发现官网的jar包已经升级到了4.5.3,尝试引入,所有的问题都解决了。
<!-- 阿里云短信 -->
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>aliyun-java-sdk-core</artifactId>
<version>4.5.3</version>
</dependency>
进入包中查看发现新版已经去掉com.sun.xml.bind这两个包了,应该也是修复了相应的bug。
总结
纠结了大半天的问题,升级一下就解决了,还是需要仔细分析问题,从源头找解决办法,特此记录一下。