转载:
https://blog.csdn.net/qq_41694906/article/details/88029533
结合上面的调用和如下的补充,选择其中适合自己习惯的使用。
1 发布服务 springboot项目正常启动就行了
1.1 添加依赖
<!--cxf归档接口-->
<dependency>
<groupId>org.codehaus.woodstox</groupId>
<artifactId>woodstox-core-asl</artifactId>
<version>4.4.1</version>
</dependency>
<dependency>
<groupId>org.apache.neethi</groupId>
<artifactId>neethi</artifactId>
<version>3.0.3</version>
</dependency>
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-core</artifactId>
<version>3.2.4</version>
</dependency>
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-rt-frontend-jaxws</artifactId>
<version>3.2.4</version>
</dependency>
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-rt-transports-http</artifactId>
<version>3.2.4</version>
</dependency>
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-rt-transports-http-jetty</artifactId>
<version>3.2.4</version>
</dependency>
1.2 写接口
package com.hcy.webservice.service;
import javax.jws.WebService;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@WebService
public interface TestService {
public String hello();
public String hello2(String name);
public List<String> hello3(String name);
public HashMap<String,String> hello4(String name, String name2, String name3);
}
package com.hcy.webservice.service;
import org.springframework.stereotype.Service;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@Service
public class TestServiceImpl implements TestService{
@Override
public String hello() {
return "webservice success";
}
@Override
public String hello2(String name) {
return "webservice success,"+name;
}
//["a","b","c","d","e","e"]
@Override
public List<String> hello3(String name) {
return Arrays.asList("a","b","c","d","e","e");
}
//{"entry":[{"value":"cxf1","key":"a"},{"value":"cxf22","key":"b"},{"value":"cxf33","key":"c"}]}
@Override
public HashMap<String, String> hello4(String name,String name2,String name3) {
return new HashMap<String, String>(){{
put("a", name + "1");
put("b", name2 + "2");
put("c", name3 + "3");
}};
}
public HashMap<String, String> hello5(String name,String name2,String name3) {
return new HashMap<String, String>(){{
put("a", name + "1");
put("b", name2 + "2");
put("c", name3 + "3");
}};
}
}
1.3 发布
package com.hcy.webservice.service;
import lombok.extern.slf4j.Slf4j;
import org.apache.cxf.jaxws.JaxWsServerFactoryBean;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.ApplicationArguments;
import org.springframework.boot.ApplicationRunner;
import org.springframework.boot.CommandLineRunner;
import org.springframework.stereotype.Component;
@Component
@Slf4j
public class PublicWebService implements ApplicationRunner {
@Autowired
private TestService testService;
private String statementUrl="http://127.0.0.1:8666/mc/PigeonholeService?wsdl";
@Override
public void run(ApplicationArguments args) throws Exception {
log.info("服务发布成功,实现类对象:{}",testService);
//创建发布工厂
JaxWsServerFactoryBean jaxWsServerFactoryBean = new JaxWsServerFactoryBean();
//通过工厂设置服务地址(服务访问地址)注入如果要访问服务说明书(wsdl)
//也是使用的该地址,在该地址后面加上?wsdl接口
jaxWsServerFactoryBean.setAddress(statementUrl);
//设置服务类(将服务实现类放入)
jaxWsServerFactoryBean.setServiceBean(testService);
//发布服务
jaxWsServerFactoryBean.create();
log.info("发布成功");
}
}
2 客户端
2.1 springboot项目,引入整合包
<!-- <dependency>-->
<!-- <groupId>org.apache.cxf</groupId>-->
<!-- <artifactId>cxf-spring-boot-starter-jaxws</artifactId>-->
<!-- <version>3.4.5</version>-->
<!-- </dependency>-->
调用代码
package com.hcy.mywebmvc.alarm;
import com.alibaba.fastjson.JSON;
import lombok.extern.slf4j.Slf4j;
import org.apache.axis.client.Call;
import org.apache.axis.client.Service;
import org.apache.axis.encoding.XMLType;
import org.apache.cxf.endpoint.Client;
import org.apache.cxf.jaxws.JaxWsProxyFactoryBean;
import org.apache.cxf.jaxws.endpoint.dynamic.JaxWsDynamicClientFactory;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.xml.namespace.QName;
import javax.xml.rpc.ParameterMode;
import java.util.ArrayList;
import java.util.Map;
@Slf4j
@RestController
public class TestWebservice2 {
@GetMapping("ws4")
public String ws4(String name) throws Exception {
JaxWsDynamicClientFactory dcf = JaxWsDynamicClientFactory.newInstance();
Client client = dcf.createClient("http://127.0.0.1:8666/mc/PigeonholeService?wsdl");
Object[] objects = client.invoke("hello2",name);//list3方法名 后面是可变参数
//输出调用结果
System.out.println(objects[0].getClass());
System.out.println(objects[0].toString());
String s = JSON.toJSON(objects[0]).toString();
System.out.println(s);
return s;
}
2.2 不用springboot整合sxf,单独引入jar
<!--cxf归档接口-->
<dependency>
<groupId>org.codehaus.woodstox</groupId>
<artifactId>woodstox-core-asl</artifactId>
<version>4.4.1</version>
</dependency>
<dependency>
<groupId>org.apache.neethi</groupId>
<artifactId>neethi</artifactId>
<version>3.0.3</version>
</dependency>
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-core</artifactId>
<version>3.2.4</version>
</dependency>
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-rt-frontend-jaxws</artifactId>
<version>3.2.4</version>
</dependency>
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-rt-transports-http</artifactId>
<version>3.2.4</version>
</dependency>
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-rt-transports-http-jetty</artifactId>
<version>3.2.4</version>
</dependency>
<!--该依赖必须要有这个是webservice发送时需要的-->
<!-- https://mvnrepository.com/artifact/wsdl4j.wso2/wsdl4j -->
<dependency>
<groupId>wsdl4j</groupId>
<artifactId>wsdl4j</artifactId>
<version>1.6.3</version>
</dependency>
<!--该依赖必须要有这个是webservice发送时需要的-->
<!-- https://mvnrepository.com/artifact/org.apache.axis/axis -->
<dependency>
<groupId>org.apache.axis</groupId>
<artifactId>axis</artifactId>
<version>1.4</version>
</dependency>
<!--axisrpc依赖-->
<!-- https://mvnrepository.com/artifact/axis/axis-jaxrpc -->
<dependency>
<groupId>axis</groupId>
<artifactId>axis-jaxrpc</artifactId>
<version>1.4</version>
</dependency>
<!-- https://mvnrepository.com/artifact/commons-discovery/commons-discovery -->
<dependency>
<groupId>commons-discovery</groupId>
<artifactId>commons-discovery</artifactId>
<version>0.2</version>
</dependency>
调用代码:
import com.alibaba.fastjson.JSON;
import lombok.extern.slf4j.Slf4j;
import org.apache.axis.client.Call;
import org.apache.axis.client.Service;
import org.apache.axis.encoding.XMLType;
import org.apache.cxf.endpoint.Client;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.xml.namespace.QName;
import javax.xml.rpc.ParameterMode;
@Slf4j
@RestController
public class TestWebservice2 {
@GetMapping("ws6")
public String ws6(String name,String method) throws Exception {
String msg = "";
try {
Service service = new Service();
Call call = (Call) service.createCall();
call.setTargetEndpointAddress(new java.net.URL("http://127.0.0.1:8666/mc/PigeonholeService?wsdl"));
//设置命名空间第一个参数为命名空间 第二个为方法名称
QName qName = new QName("http://service.webservice.hcy.com/",
method);
call.setOperationName(qName);
//设置发送参数的格式
Object[] objects = new Object[1];
call.addParameter("arg0", XMLType.XSD_STRING, ParameterMode.IN);
objects[0] = name;
call.setReturnType(XMLType.XSD_STRING);
// call.setReturnType(XMLType.SOAP_ARRAY);
//接口调用参数有可能没有
Object invoke = call.invoke(objects);
System.out.println(invoke.getClass().toString());
// msg = (String) invoke;
log.info("webservice告警转单返回{}:", invoke);
} catch (Exception e) {
log.error("调用webService接口异常:{}", e);
}
return msg;
}