震惊~~都2023年了竟然还有人用webservice!
1、springboot集成webservice
maven添加依赖
<!--通过cxf实现webservice-->
<dependency>
<groupid>org.springframework.boot</groupid>
<artifactid>spring-boot-starter-web-services</artifactid>
</dependency>
<dependency>
<groupid>org.apache.cxf</groupid>
<artifactid>cxf-rt-frontend-jaxws</artifactid>
<version>3.5.1</version>
</dependency>
<dependency>
<groupid>org.apache.cxf</groupid>
<artifactid>cxf-rt-transports-http</artifactid>
<version>3.5.1</version>
</dependency>
<!--解析xml-->
<dependency>
<groupid>org.dom4j</groupid>
<artifactid>dom4j</artifactid>
<version>2.1.3</version>
</dependency>
添加配置文件
@configuration
public class cxfconfig {
//自定义拦截器 用于处理返回数据格式
@autowired
private cxfoutterceptor cxfoutterceptor;
@bean
public servletregistrationbean disservlet() {
servletregistrationbean servletregistrationbean = new servletregistrationbean(new cxfservlet(), "/webservice/*");
return servletregistrationbean;
}
@bean(name = bus.default_bus_id)
public springbus springbus() {
return new springbus();
}
@bean
public endpoint endpoint() {
endpointimpl endpoint = new endpointimpl(springbus(), new accountserviceimpl());
//发布一个名为accountservice的webservice服务,可以多个
endpoint.publish("/accountservice");
endpoint.getoutinterceptors().add(cxfoutterceptor);
return endpoint;
}
}
自定义拦截器
@component
public class cxfoutterceptor extends abstractphaseinterceptor<message> {
public cxfoutterceptor() {
super(phase.pre_stream);
}
public cxfoutterceptor(string phase) {
super(phase);
}
@override
public void handlemessage(message message) throws fault {
try {
outputstream os = message.getcontent(outputstream.class);
cachedstream cs = new cachedstream();
message.setcontent(outputstream.class, cs);
message.getinterceptorchain().dointercept(message);
cachedoutputstream csnew = (cachedoutputstream) message.getcontent(outputstream.class);
inputstream in = csnew.getinputstream();
string xml = ioutils.tostring(in);
stringbuffer stringbuffer = new stringbuffer();
//去掉外层包装
document document = documenthelper.parsetext(xml);
element rootelement = document.getrootelement();
list<element> elements1 = rootelement.elements();
if(elements1!=null && elements1.size()>0){
element element = elements1.get(0);
list<element> elements = element.elements();
if(elements!=null && elements.size()>0){
element areturn = elements.get(0).element("return");
string name = areturn.getname();
string adata = areturn.getdata().tostring();
stringbuffer = new stringbuffer(adata);
}
}
//这里对xml做处理,处理完后同理,写回流中
ioutils.copy(new bytearrayinputstream(stringbuffer.tostring().getbytes()), os);
cs.close();
os.flush();
message.setcontent(outputstream.class, os);
} catch (exception e) {
e.printstacktrace();
}
}
private class cachedstream extends cachedoutputstream {
public cachedstream() {
super();
}
protected void doflush() {
//currentstream.flush();
}
protected void doclose(){
}
protected void onwrite(){
}
}
}
通过cxf实现wenservice服务返回结果是有一层固定包装的,类似下图,return标签里才是结果,如何完全自定义返回的结果数据呢?就需要上面的拦截器去掉外层的包装。

service类
@webservice(name = "accountservice",
targetnamespace = "http://server.webservice.kaka.com"
)
public interface accountservice {
@webmethod
public string sendmessage(@webparam(name = "username",targetnamespace="http://server.webservice.kaka.com") string username);
@webmethod
public boolean getflag(@webparam(name = "username",targetnamespace="http://server.webservice.kaka.com") string username);
@webmethod
public string queryusers();
}
实现类
@webservice(servicename = "accountservice",
//名命空间可任意写 要跟service里的保持一致
targetnamespace = "http://server.webservice.kaka.com",
//接口类的全路径
endpointinterface = "com.kaka.webservice.accountservice"
)
@component
@slf4j
public class accountserviceimpl implements accountservice {
@override
public string sendmessage(string username) {
return "=====hello! " + username + "=====";
}
@override
public boolean getflag(string username) {
return false;
}
}
接下来启动服务,浏览器访问ip:端口/webservice/accountservice?wsdl
即可看到wsdl信息

2、postman测试
headers添加
key:content-type
value:text/xml;charset=utf-8

然后body选择raw,xml

<?xml version="1.0" encoding="utf-8"?>
<soap:envelope xmlns:xsi="http://www.w3.org/2001/xmlschema-instance" xmlns:xsd="http://www.w3.org/2001/xmlschema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:body>
<sendmessage xmlns="http://server.kaka.com">
<username>测试啊</username>
</sendmessage>
</soap:body>
</soap:envelope>
如果使用了上面的自定义拦截器,则调用的返回结果为:

发表评论