SpringBoot整合cxf发布webService
2. cxf的pom依赖
1 <dependency>
2 <groupId>org.apache.cxf</groupId>
3 <artifactId>cxf-spring-boot-starter-jaxws</artifactId>
4 <version>3.2.4</version>
5 </dependency>
3. 开始编写webService服务端
3.1 实体类entity
1 package com.example.demo.entity;
2
3 import java.io.Serializable;
4 /
5 @ClassName:User
6 @Description:测试实体
7 @author Jerry
8 @date:2018年4月10日下午3:57:38
9 */
10 public class User implements Serializable{
11
12 private static final long serialVersionUID = -3628469724795296287L;
13
14 private String userId;
15 private String userName;
16 private String email;
17 public String getUserId() {
18 return userId;
19 }
20 public void setUserId(String userId) {
21 this.userId = userId;
22 }
23 public String getUserName() {
24 return userName;
25 }
26 public void setUserName(String userName) {
27 this.userName = userName;
28 }
29 public String getEmail() {
30 return email;
31 }
32 public void setEmail(String email) {
33 this.email = email;
34 }
35 @Override
36 public String toString() {
37 return "User [userId=" + userId + ", userName=" + userName + ", email=" + email + "]";
38 }
39
40 }**
3.2 服务接口
package com.example.demo.service;
import javax.jws.WebMethod;
import javax.jws.WebParam;
import javax.jws.WebResult;
import javax.jws.WebService;import com.example.demo.entity.User;
/@WebResult(name=" string",targetnamespace="" )
@ClassName:UserService
@Description:测试服务接口类
include:两个测试方法
@author Jerry
@date:2018年4月10日下午3:58:10*/
//@WebService(targetNamespace=" http:="" service.demo.example.com")如果不添加的话,动态调用invoke的时候,会报找不到接口内的方法,具体原因未知.
br/>@WebResult(name="String",targetNamespace="")<br <="" a="">public String getUserName(@WebParam(name = "userId") String userId);="">@WebResult(name=" string",targetnamespace="" )
="">3.3 服务接口的实现类
@WebResult(name=" string",targetnamespace="" )}
@ClassName:UserServiceImpl
@Description:测试服务接口实现类
@author Jerry
@WebResult(name=" string",targetnamespace="" )
@date:2018年4月10日下午3:58:58*/
@WebService(serviceName=" userservice",="" 对外发布的服务名
br/>@Component<br <="" a="">public class UserServiceImpl implements UserService{@Component
private Map<String, User> userMap = new HashMap<String, User>();
public UserServiceImpl() {
System.out.println("向实体类插入数据");
User user = new User();
user.setUserId(UUID.randomUUID().toString().replace("-", ""));user.setUserName(" test1");
user.setEmail("Jerry@163.xom");
br/>@Override<br <="" a="">public String getUserName(String userId) {
return "userId为:" + userId;}
@Override
="">="">="">}
@Override
}****
="">
@Overridepackage com.example.demo.config;
import javax.xml.ws.Endpoint;
import org.apache.cxf.Bus;
import org.apache.cxf.jaxws.EndpointImpl;
import org.apache.cxf.transport.servlet.CXFServlet;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.web.servlet.ServletRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;import com.example.demo.service.UserService;
/**
}
@Override
}
@Override
br/>*/
@Configuration<br <="" a="">public class CxfConfig {@Autowired@Autowired
UserService userService;/**
*/
@Autowired
去掉注释后:wsdl访问地址为:http://127.0.0.1:8080/soap/user?wsdl
@return*/
@SuppressWarnings(" all")
="">
@SuppressWarnings(" all")
="">站点服务
*/
@SuppressWarnings(" all")
br/>@Bean<br <="" a="">public Endpoint endpoint() {
EndpointImpl endpoint = new EndpointImpl(bus, userService);
endpoint.publish("/user");
return endpoint;
}="">@Bean
@Bean
}
="">
@Bean
package com.example.demo.client;
import org.apache.cxf.endpoint.Client;
import org.apache.cxf.jaxws.JaxWsProxyFactoryBean;
import org.apache.cxf.jaxws.endpoint.dynamic.JaxWsDynamicClientFactory;
import com.example.demo.service.UserService;
/**
@Bean
@date:2018年4月10日下午4:14:07
*/
public class CxfClient {
public static void main(String[] args) {
CxfClient.main1();
CxfClient.main2();
}
/**
@Bean
1.代理类工厂的方式,需要拿到对方的接口地址
*/
public static void main1() {
try {
// 接口地址
String address = "http://127.0.0.1/soap/user?wsdl";
// 代理工厂
JaxWsProxyFactoryBean jaxWsProxyFactoryBean = new JaxWsProxyFactoryBean();
// 设置代理地址
jaxWsProxyFactoryBean.setAddress(address);
// 设置接口类型
jaxWsProxyFactoryBean.setServiceClass(UserService.class);
// 创建一个代理接口实现
UserService us = (UserService) jaxWsProxyFactoryBean.create();
// 数据准备
String userId = "maple";
// 调用代理接口的方法调用并返回结果
String result = us.getUserName(userId);
System.out.println("返回结果:" + result);
} catch (Exception e) {
e.printStackTrace();
}
}
/**
2:动态调用
*/
public static void main2() {
// 创建动态客户端
JaxWsDynamicClientFactory dcf = JaxWsDynamicClientFactory.newInstance();
Client client = dcf.createClient("http://127.0.0.1/soap/user?wsdl");
// 需要密码的情况需要加上用户名和密码
// client.getOutInterceptors().add(new ClientLoginInterceptor(USER_NAME, PASS_WORD));
Object[] objects = new Object[0];
try {
// invoke("方法名",参数1,参数2,参数3....);
objects = client.invoke("getUserName", "maple");
System.out.println("返回数据:" + objects[0]);
} catch (java.lang.Exception e) {
e.printStackTrace();
}
}
}
6. 注意点.
诚如之前所说,如果接口的注解上不加targetNamespace的话,动态调用的时候,会报如下的错误。
共同学习,写下你的评论
评论加载中...
作者其他优质文章