SpringCloud集成cxf步驟記錄
1.0 什么是cxf
Apache CXF
是一個(gè)開源的Service
框架,簡(jiǎn)化用戶的service
開發(fā)扯俱,基于CXF開發(fā)的應(yīng)用可提供SOAP
喇澡、XML/HTTP
晴玖、RESTFUL HTTP
或CORBA
等服務(wù)。CXF
底層頁(yè)可以使用不同的傳輸協(xié)議让簿,包括HTTP
尔当、JMS
或JBI
等椭迎。
1.0.1cxf特性
- 支持大量的Web Service標(biāo)準(zhǔn):包括SOAP、WS-I Basic Profile缴阎、WSDL蛮拔、WS-Addressing建炫、WS-Policy、WS-ReliableMessaging和WS-Security廊驼。
- 支持大量的前端(frontend)編程模型妒挎。CXF實(shí)現(xiàn)了標(biāo)準(zhǔn)的JAX-WS API酝掩,它也包括一種被稱為簡(jiǎn)單前端(simple frontend)的模型,這種模型無(wú)需annotation支持原朝。
- CXF支持web service的兩種開發(fā)模式:
- 規(guī)則(contract)優(yōu)先: 通過(guò)編寫WSDL來(lái)開發(fā)
web service
; - 代碼優(yōu)先: 通過(guò)編寫java代碼來(lái)開發(fā)
webservice.
- 規(guī)則(contract)優(yōu)先: 通過(guò)編寫WSDL來(lái)開發(fā)
2. 0 集成引入
<!-- cxf start -->
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-spring-boot-starter-jaxws</artifactId>
<version>3.3.0</version>
</dependency>
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-rt-features-logging</artifactId>
<version>3.3.0</version>
</dependency>
<!-- cxf end -->
注意事項(xiàng):
cxf
版本需要與SpringBoot的版本對(duì)應(yīng),不然因版本問(wèn)題茂蚓, 整合cxf-spring-boot-starter-jaxws的啟動(dòng)項(xiàng)目會(huì)出現(xiàn)異常。
具體對(duì)應(yīng)關(guān)系上倉(cāng)庫(kù)進(jìn)行查看下
https://mvnrepository.com/artifact/org.apache.cxf/cxf-spring-boot-starter-jaxws查找到j(luò)axws的各種版本负乡,進(jìn)入之后可以看到對(duì)應(yīng)的springboot版本
image.png
3.服務(wù)端
3.1 CXF配置類
/**
* <b>功能描述:CXF配置類</b><br>
*
* @author newzhong
* @version 1.0.0
* @since JDK 1.8
*/
public class CxfConfig {
@Bean(name = Bus.DEFAULT_BUS_ID)
public SpringBus springBus() {
SpringBus bus = new SpringBus();
bus.getFeatures().add(new LoggingFeature());
return bus;
}
}
3.2 服務(wù)的發(fā)布
自定義注解標(biāo)注要發(fā)布的服務(wù)類抖棘,發(fā)布出去
/**
* <p>description:自動(dòng)發(fā)布接口地址注解</p>
*
* @author newzhong
* @version 1.0
*/
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
public @interface AutoPublish {
/**
*<p>description:發(fā)布地址</p>
* @return String
* @author newzhong
*/
String publishAddress();
}
@Component
@Slf4j
public class PublishEndpoint implements ApplicationRunner{
@Autowired
private WebApplicationContext applicationConnect;
@Autowired()
@Qualifier(Bus.DEFAULT_BUS_ID)
private SpringBus bus;
@SuppressWarnings("resource")
@Override
public void run(ApplicationArguments applicationArguments) throws Exception {
log.info("開始進(jìn)行自動(dòng)發(fā)布webService接口");
String[] beanNames = applicationConnect.getBeanNamesForAnnotation(AutoPublish.class);
for(String beanName : beanNames) {
String publishAddr = applicationConnect.getType(beanName).getAnnotation(AutoPublish.class).publishAddress();
EndpointImpl endpoint = new EndpointImpl(bus, applicationConnect.getBean(beanName));
endpoint.publish(publishAddress);
log.info(String.format("發(fā)布接口地址:[%s]", publishAddress));
}
log.info("weBservice接口自動(dòng)發(fā)布結(jié)束");
}
}
3.3 發(fā)布的地址yml,nacos配置
cxf:
path: /cxf
原本默認(rèn)的默認(rèn)端口號(hào)后 +拼接 /service数尿,現(xiàn)在可以根據(jù)需求進(jìn)行修改
3.4. 新增服務(wù)接口
在接口上添加@WebService
注解
-
@WebParam
表示方法的參數(shù)右蹦,如果不加此注解歼捐,方法的參數(shù)都從arg0
,開始豹储,隨著參數(shù)增多,name不斷增加為arg1,arg2..........; -
@WebResul
t表示方法的返回值巩剖, 沒有此注解 返回值名字為return
/**
* <b>功能描述:webService測(cè)試接口</b><br>
* @author newzhong
* @version 1.0.0
* @since JDK 1.8
*
* @Note
* <b>創(chuàng)建時(shí)間:</b> 2021-03-27 14:32
*/
@WebService(
endpointInterface = "com.newzhong.IWebServiceTest",
serviceName = "WebServiceTest")
@AutoPublish(publishAddr = "test")
public interface IWebServiceTest {
/**
* <b>功能描述:webService測(cè)試接口</b>
* @author newzhong
* @version 1.0.0
* @since JDK 1.8
*
* @param name 名字
* @return String
* @Note
*/
String getUserService(@WebParam(name = "name")String name);
}
3.5 新增服務(wù)接口實(shí)現(xiàn)類
serviceName
: 對(duì)外發(fā)布的服務(wù)名,指定 Web Service 的服務(wù)名稱:wsdl:service晦炊。缺省值為 Java 類的簡(jiǎn)單名稱 + Service。(字符串)endpointInterface
: 服務(wù)接口全路徑, 指定做SEI(Service EndPoint Interface)服務(wù)端點(diǎn)接口name
:此屬性的值包含XML Web Service的名稱贤姆。在默認(rèn)情況下庐氮,該值是實(shí)現(xiàn)XML Web Service的類的名稱弄砍,wsdl:portType 的名稱。缺省值為 Java 類或接口的非限定名稱慨畸。(字符串portName
: wsdl:portName寸士。缺省值為 WebService.name+Port弱卡。targetNamespace
:指定你想要的名稱空間婶博,認(rèn)是使用接口實(shí)現(xiàn)類的包名的反綴wsdlLocation
:指定用于定義 Web Service 的 WSDL 文檔的 Web 地址凡人。Web 地址可以是相對(duì)路徑或絕對(duì)路徑叹阔。(字符串)
注意:實(shí)現(xiàn)類上可以不添加Webservice注解 ,加在接口上
@Component
@Slf4j
public class WebServiceTest implements IWebServiceTest{
@Override
public String getUserService(String name) {
log.info("i am"耳幢,name )
return str;
}
}
3.6 驗(yàn)證服務(wù)發(fā)布
通過(guò)瀏覽器訪問(wèn)wsdl睛藻,wsdl路徑即為發(fā)布的路徑加上?wsdl
http://127.0.0.1:[端口號(hào)]/cxf/test?wsdl
可以看到接口就成功了修档。
到此服務(wù)端開發(fā)結(jié)束府框!
4.客戶端
4.1 IDEA根據(jù)?wsdl
生成客戶端
- 填入對(duì)應(yīng)的?wsdl
4.2 測(cè)試工具跟據(jù)?wsdl 測(cè)試
如果是soapui工具院峡,發(fā)送的參數(shù)包括xml的:將xml寫在<![CDATA[ 【xml】]]>
里面