java soap1.2_WebService:设置服务器提供SOAP1.2的服务

本文介绍了如何使用Java CXF框架创建SOAP1.2协议的WebService服务。首先展示了通过CXF的wsdl2java工具生成Java类来访问服务,然后详细阐述了使用JaxWsProxyFactoryBean类进行调用的方法,以及添加@BindingType注解切换到SOAP1.2协议的过程。此外,还讨论了SOAP1.2在某些工具中的限制,如Web Service Explorer,以及如何处理不兼容问题和利用CXF拦截器拦截请求响应信息。
摘要由CSDN通过智能技术生成

1,访问通过cxf发布的服务

(1)与之前一样,同样可以通过在本地通过wsdl文件和命令行生成Java文件来访问服务。

但是我们既然使用了cxf发布,就要通过cxf的工具生成访问。可以通过cxf目录的bin目录下的wsdl2java.bat文件访问服务。

例如:要在d:/a下生成Java类,与之前不同的是,cxf默认生成的Java文件,而wsimport默认生成的是class文件。

5adb71538b2ea558e0aaac1921858d89.png

没有提示,在d:/a下生成了cn文件目录。

aa8699d9cf28ce38b37ba0c3af7d45aa.png

(2)将生成的cn目录拷贝到工程中。

acaaff9e7229c03f5886800517448fda.png

(3)建立一个测试类,TestMain.java

(4)编写TestMain.java

public classTestMain {public static voidmain(String[] args) {

HelloWorld helloWorld= newHelloWorldService().getHelloWorldPort();

helloWorld.sayHello();

}

}

运行,访问成功,打印hello cxf!!!

598ba6fc27256216a9f0937962d4efe9.png

2,另一种调用方式:通过JaxWsProxyFactoryBean类调用,不过我们一般不使用这种方式,因为这种方式要求两边都是cxf,但两边经常不一样,不方便。

这种方式要先在服务器抽取一个接口。

(1)开发服务端:

@WebServicepublic class HelloWorld implementsIHelloWorld {

@OverridepublicString sayHello() {

System.out.println("hello cxf!!!");return "11111";

}public static void main(String[] args) throwsInterruptedException {/*** 这里为什么使用set方式设置呢,因为cxf要与spring整合,spring的设值注入都是通过set 方法注入的。*/

//cxf发布形式

JaxWsServerFactoryBean factoryBean = newJaxWsServerFactoryBean();//设置地址

factoryBean.setAddress("http://192.168.0.104:8989/hello");//设置具体类

factoryBean.setServiceBean(newHelloWorld());//设置接口。

factoryBean.setServiceClass(IHelloWorld.class);//启动

factoryBean.create();

}

}

注意:需要为factorybean设置接口factoryBean.setServiceClass(IHelloWorld.class);

并实现接口,public class HelloWorld implements IHelloWorld。

(2)抽取的接口

@WebServicepublic interfaceIHelloWorld {public abstractString sayHello();

}

(3)开发客户端

public classClient {public static voidmain(String[] args) {

JaxWsProxyFactoryBean bean= newJaxWsProxyFactoryBean();

bean.setAddress("http://192.168.0.104:8989/hello?wsdl");

bean.setServiceClass(IHelloWorld.class);

IHelloWorld world=(IHelloWorld) bean.create();

String s=world.sayHello();

System.out.println(s);

}

}

(4)先启动服务端,在启动客户端测试。

3,通过cxf框架使用soap1.2协议。

在接口中,加上注释,在发布服务即可。

@WebService//绑定为soap1.2,使用soap1.2协议

@BindingType(javax.xml.ws.soap.SOAPBinding.SOAP12HTTP_BINDING)public interfaceIHelloWorld {public abstractString sayHello();

}

a131cf101eb6b77b10f6113896632e60.png

在生成的wsdl文档中有如图显示。

注意:soap1.2不可以在web service explorer中测试,MyEclipse只支持1.1,soap1.2无法显示。

Soap1.2的wsdl不可以通过wsimport生成Java文件,能生成一部分,但是不完整,没有主文件类。

4,一开始手机归属地查询的案例中,通过网上的wsdl生成Java代码的时候,产生warning的原因:通过jdk的wsimport命令生成Java文件报告warning:

0c7a585b33356030e18f957a35197b87.png

因为jdk只支持soap1.1,其他都不支持,而这个wsdl中有4中协议版本,soap1.1、soap1.2、Get、Post。它会忽略出soap1.1以外的其他三种。

e4d504a6d3c53055b3093c11b7d99fc6.png

5,使用网站上的中英文翻译服务的时候,wsimport生成Java文件是全部无法生成,怎么办呢?

698dd2eedfa4b9187ab8384da52d3674.png

将页面另存为a.wsdl。在本地打开下载的文件。

修改error的错误,第19行报错。说有一个引用找不到,s:schema找不到,到19行删掉他即可。这个标记是微软写的,是个假引用,没什么作用,删掉即可。

在105行,报error。删掉即可。

修改完根据这个a.wsdl文件生成Java代码。

a8cfb5beaec7bdafd495d6669a1e2558.png

就OK了。

6,使用cxf的wsdl2java.bat工具可以生成soap1.2规范的wsdl的Java文件。

7,使用soap1.2的工程无法使用webservice explorer实现请求响应信息拦截,可以通过cxf自带的拦截器拦截信息。

在启动服务之前添加拦截请求和响应的拦截器即可。

9401d2b60c8cee29f57058bd5116d785.png

cebe9eb3241533c505ee51a73318608e.png

这时soap1.2下的访问情况,这时将服务端的soap1.2的注解去掉,变成soap1.1的,在通过客户端访问,也可以访问,说明客户端可以自动根据服务端判定是soap1.1还是soap1.2。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值