简单介绍:
A项目需要调用B项目的方法,可以通过webService(下面简写为ws)提供接口的服务,ws提供接口的方式比较多,这里写关于soap服务的提供和调用。
两个项目:ws_service(提供者)、ws_consumer(消费者)
在ws_service中存在 selectUserById方法,传递id,返回json字符串;
1.代码实例
服务提供者
添加所需jar包
<!--cxf-->
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-rt-frontend-jaxws</artifactId>
<version>3.0.5</version>
</dependency>
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-rt-transports-http</artifactId>
<version>3.0.5</version>
</dependency>
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-rt-ws-security</artifactId>
<version>3.0.5</version>
</dependency>
<dependency>
<groupId>org.apache.ws.security</groupId>
<artifactId>wss4j</artifactId>
<version>1.5.2</version>
</dependency>
2.web.xml文件中添加 CXFServlet
<!-- 添加ws需要的 CXFServlet-->
<servlet>
<servlet-name>cxf</servlet-name>
<servlet-class>org.apache.cxf.transport.servlet.CXFServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>cxf</servlet-name>
<!--设置拦截路径-->
<url-pattern>/cxf/*</url-pattern>
</servlet-mapping>
3.创建服务接口
注意添加 @WebService注解;添加在接口或者实现类上都可以。
package com.mr.user.service;
import javax.jws.WebService;
/**
* Created by LI WAN on 2019/1/23.
*/
@WebService
public interface UserService {
String userSelectById(Integer id);
}
4.创建接口实现类
实现类实现接口,重写接口中的方法,这里简单的输出一下,在项目中,可以通过spring注入UserService bean对象,通过 id 查询数据;将查询到的数据,转换为json返回即可。
package com.mr.user.service;
import com.mr.user.mapper.UserMapper;
import com.mr.utils.MyWsUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
/**
* Created by LI WAN on 2019/1/23.
*/
public class UserServiceImpl implements UserService{
@Autowired
private UserMapper userMapper;
@Override
public String userSelectById(Integer id) {
System.out.println("通过id:"+id+"查询数据");
return "通过"+id+"查询到张三用户的数据";
}
}
5.暴露服务接口
在spring配置文件中添加代码:
头约束
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:jaxws="http://cxf.apache.org/jaxws"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://cxf.apache.org/jaxws
http://cxf.apache.org/schemas/jaxws.xsd">
<!-- 通过 bean标签将实现类添加在IOC容器中,也可以通过注解方式 -->
<bean id="userServerImpl" class="com.mr.server.UserServerImpl"></bean>
<!--
暴露接口
通过 <jaxws:endpoint ></jaxws:endpoint >标签暴露接口
address:通过该地址访问到该接口服务
implementor:语法:#对象名,这里引入的是spring IOC容器中的对象名
实现类添加在容器中,可以通过<bean id="" class="" >
或者通过@Component() 注解
-->
<jaxws:endpoint address="/user" implementor="#userServerImpl"></jaxws:endpoint>
6.启动项目,查看接口
访问路径:ip:端口号/项目名/CXFServlet(web.xml)中设置的拦截路径
7.查看接口
注意:记住这个路径,下面会使用到,
8.测试接口
写接口的目的是让别人调用,但是也要确保接口能使用,所以要对接口进行测试,查看是否可以使用,然后再将接口给别人调用。
new
开发接口 成功
服务消费者
1.创建消费者项目
2.jar包同上
3.添加 MyWsUtil 工具类
package com.mr.utils;
import com.mr.user.service.UserService;
import org.apache.cxf.jaxws.JaxWsProxyFactoryBean;
/**
* Created by LI WAN on 2019/1/23.
*/
public class MyWsUtil {
/**
* 获取webservice服务接口
* @param url :ws接口路径
* @param t :接口class对象
* @param <T> :java类
* @return
*/
public static <T> T getMyWs(String url, Class<T> t) {
JaxWsProxyFactoryBean jwpf = new JaxWsProxyFactoryBean();
jwpf.setAddress(url);
jwpf.setServiceClass(t);
T create = (T)jwpf.create();
return create;
}
//测试
public static void main(String[] args) {
//接口的wsdl路径
String url = "http://localhost:8085/cxf/user?wsdl";
//工具类获取到 接口
UserService userService = MyWsUtil.getMyWs(url, UserService.class);
//直接调用接口,传入参数,获取到返回值
String s = userService.userSelectById(1);
System.out.println(s);
}
}
4.在项目中添加接口
5.调用
public static void main(String[] args) {
//接口的wsdl路径
String url = "http://localhost:8085/cxf/user?wsdl";
//工具类获取到 接口
UserService userService = MyWsUtil.getMyWs(url, UserService.class);
//直接调用接口,传入参数,获取到返回值
String s = userService.userSelectById(1);
System.out.println(s);
}