java处理Webservice服务的发布以及客户端生成流程(快速上手直接撸)

前言

以 HTTP 协议为基础,通过 XML 进行客户端和服务器端通信的框架 / 组件
两个关键点 :

  1. 服务端提供的功能 , 通过 xml 描述
  2. 第一步中的描述的功能 , 嵌入到 HTTP 协议中 , 使得能通过 HTTP 协议进行通信【所谓的 SOAP 】 .

发布

传统的web项目中发布

  • 新增如下的业务处理类(自己随便写)
/**  
* <p>Title: DistrictInfoMapping.java</p>  
* <p>Description: </p>  
* <p>Copyright: Copyright (c) 2023</p>   
* @author wangzhen  
* @date 2023年3月13日  
* @version 1.0  
*/  
package com.aip.webservice.web;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;

import org.apache.commons.lang.StringUtils;

import com.aip.webservice.common.interceptor.XMLLogger;
import com.aip.webservice.nyplat.dto.domain.GynxComCodeMappingDto;
import com.aip.webservice.nyplat.resource.dtofactory.domain.DBGynxComCodeMapping;
import com.sysframework.reference.DBManager;
import com.utility.SysConfig;

/**  
* <p>Title: CompanyInfoMappingService</p>  
* <p>Description: 查询机构信息映射表 </p>  
* @author wangzhen  
* @date 2023年3月13日  
*/
public class CompanyInfoMappingService {
	
	// 注意:wsdl服务不支持map以及List
	public String[] queryPlatMapInfo(String[] comcodeArr) throws SQLException{
		// 分别开启两个链接
		DBManager ddccdDBManager = new DBManager();
		DBManager daaplatformDBManager = new DBManager();
	
		List<String> restMappingList = new LinkedList<String>();
		ResultSet resultSet = null;
		try {
			ddccdDBManager.open(SysConfig.getProperty("DDCCDATASOURCE"));
			daaplatformDBManager.open("daaplatformDataSource");
			for (String comCode : comcodeArr) {
				String nearComCode ="";
				List<String> resultList = new ArrayList<String>();
				String comListQuerySql = " 	SELECT  p.comcode FROM  agri.prpdcompany p " + "	where p.comlevel < 5 "
						+ "	START WITH    comcode= '" + comCode + "'"
						+ "	CONNECT BY  nocycle PRIOR p.uppercomcode=p.comcode order by P.COMLEVEL desc";
				resultSet = ddccdDBManager.executeQuery(comListQuerySql);
				while (resultSet.next()) {
					String currComcode = ddccdDBManager.getString(resultSet, 1);
					resultList.add(currComcode);
				}
				nearComCode = resultList.get(0);

				if (StringUtils.isBlank(nearComCode)) {
					XMLLogger.log("机构代码:" + comCode + "没有对应的上级或者本级机构");
					continue;
				}
				
				// 建查询映射信息
				
				DBGynxComCodeMapping gynxComCodeMapping = new DBGynxComCodeMapping(daaplatformDBManager);
				GynxComCodeMappingDto upperComCodeMappingDto = gynxComCodeMapping.findByPrimaryKey(nearComCode);
				if (upperComCodeMappingDto == null) {
					XMLLogger.log("机构:" + nearComCode + "没有对应的映射。");
					continue;
				}
				restMappingList.add(comCode);
				// 每次查询完就手动关闭,但实际上可不用手动关闭,因为当第二次查询会覆盖前一次的查询结果
				if (resultSet != null) {
					resultSet.close();
				}
			}
		} catch (Exception e) {
			XMLLogger.error(e);
			throw new RuntimeException("数据库查询异常",e);
		} finally {
			if (resultSet != null) {
				resultSet.close();
			}
			try {
				ddccdDBManager.close();
				daaplatformDBManager.close();
			} catch (Exception elog) {
				XMLLogger.error(elog);
				elog.printStackTrace();
			}
		}
		
		String [] restComCodeArr = new String[restMappingList.size()];
		restComCodeArr = restMappingList.toArray(restComCodeArr);
		return restComCodeArr;
	}

}
  • 在web-inf的server-config.wsdd文件中新增
<?xml version="1.0" encoding="UTF-8"?>
<deployment xmlns="http://xml.apache.org/axis/wsdd/" xmlns:java="http://xml.apache.org/axis/wsdd/providers/java">
 <globalConfiguration>
  <parameter name="sendMultiRefs" value="true"/>
  <parameter name="disablePrettyXML" value="true"/>
  <parameter name="adminPassword" value="admin"/>
  <parameter name="attachments.Directory" value="C:\soft\myeclipeseworkspace\daaplatform\src\main\webapp\WEB-INF\attachments"/>
  <parameter name="dotNetSoapEncFix" value="true"/>
  <parameter name="enableNamespacePrefixOptimization" value="false"/>
  <parameter name="sendXMLDeclaration" value="true"/>
  <parameter name="sendXsiTypes" value="true"/>
  <parameter name="attachments.implementation" value="org.apache.axis.attachments.AttachmentsImpl"/>
  <requestFlow>
   <handler type="java:org.apache.axis.handlers.JWSHandler">
    <parameter name="scope" value="session"/>
   </handler>
   <handler type="java:org.apache.axis.handlers.JWSHandler">
    <parameter name="scope" value="request"/>
    <parameter name="extension" value=".jwr"/>
   </handler>
  </requestFlow>
 </globalConfiguration>
 <handler name="URLMapper" type="java:org.apache.axis.handlers.http.URLMapper"/>
 <handler name="LocalResponder" type="java:org.apache.axis.transport.local.LocalResponder"/>
 <handler name="Authenticate" type="java:org.apache.axis.handlers.SimpleAuthenticationHandler"/>
 

  <!--查询机构的codemapping信息 该处为刚刚新增的服务-->
 <service name="CompanyInfoMappingService" provider="java:RPC" style="wrapped" use="literal">
  <parameter name="allowedMethods" value="*"/>
  <parameter name="scope" value="request"/>
  <parameter name="className" value="com.sinosoft.aip.webservice.web.CompanyInfoMappingService"/>
  <parameter name="wsdlServicePort" value="CompanyInfoMappingService"/>
  <parameter name="schemaQualified" value="http://server.webservice.indiv.sinosoft.com"/>
  <parameter name="wsdlTargetNamespace" value="http://server.webservice.indiv.sinosoft.com"/>
  <parameter name="wsdlServiceElement" value="CompanyInfoMappingService"/>
 </service>


 <service name="AdminService" provider="java:MSG">
  <parameter name="allowedMethods" value="AdminService"/>
  <parameter name="enableRemoteAdmin" value="false"/>
  <parameter name="className" value="org.apache.axis.utils.Admin"/>
  <namespace>http://xml.apache.org/axis/wsdd/</namespace>
 </service>

 <transport name="http">
  <requestFlow>
   <handler type="URLMapper"/>
   <handler type="java:org.apache.axis.handlers.http.HTTPAuthHandler"/>
  </requestFlow>
  <parameter name="qs:list" value="org.apache.axis.transport.http.QSListHandler"/>
  <parameter name="qs:wsdl" value="org.apache.axis.transport.http.QSWSDLHandler"/>
  <parameter name="qs.list" value="org.apache.axis.transport.http.QSListHandler"/>
  <parameter name="qs.method" value="org.apache.axis.transport.http.QSMethodHandler"/>
  <parameter name="qs:method" value="org.apache.axis.transport.http.QSMethodHandler"/>
  <parameter name="qs.wsdl" value="org.apache.axis.transport.http.QSWSDLHandler"/>
 </transport>
 <transport name="local">
  <responseFlow>
   <handler type="LocalResponder"/>
  </responseFlow>
 </transport>
</deployment>

  • 重启服务,查询服务是否正常发布。浏览器输入验证连接: 项目路径+/service/CompanyInfoMappingService?wsdl
    如图 👇
    项目发布地址
    右键另存为到桌面。

Spring项目中发布

  • pom.xml新增对应的依赖
<!-- CXF webservice -->
	<dependency>
		<groupId>org.apache.cxf</groupId>
		<artifactId>cxf-spring-boot-starter-jaxws</artifactId>
		<version>3.1.18</version>
	</dependency>
  • 新增cxfconfig文件
package com.sinosoft.uap.config;

import com.sinosoft.uap.service.*;
import com.sinosoft.uap.service.agriclaim.*;
import com.sinosoft.uap.service.PrpallFindPolicyService;
import com.sinosoft.uap.service.PrpallSyncService;
import org.apache.cxf.Bus;
import org.apache.cxf.jaxws.EndpointImpl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import javax.xml.ws.Endpoint;

@Configuration
public class CxfConfig {
    @Autowired
    private Bus bus;
    @Autowired
    private CallCenterService callCenterService;
    
    /** JAX-WS **/
    @Bean
    public Endpoint endpoint() {
        EndpointImpl endpoint = new EndpointImpl(bus);
        
        //呼叫中心接口
        Endpoint.publish("/callCenterService", callCenterService);
    
        return endpoint;
    }
  • 新增对应的接口
package com.uap.service.user;

import javax.jws.WebMethod;
import javax.jws.WebParam;
import javax.jws.WebService;

/**
 * 呼叫中心webservice
 */
@WebService(name = "CallCenterService",
        targetNamespace = "http://user.service.uap.com/")
// 包名反写就可以        
public interface CallCenterService {

    @WebMethod
    String userService(@WebParam(name = "xml") String xml) throws Exception;

}
  • 对应实现类
package com.uap.service.user;


/**
 * 呼叫中心webservice
 */
@WebService(serviceName = "CallCenterService",
        targetNamespace = "http://service.uap.sinosoft.com/",
        endpointInterface = "com.uap.service.CallCenterService"
)
@Service
public class CallCenterServiceImpl implements CallCenterService{

    @Override
    public String userService(@WebParam(name = "xml") String xml) throws Exception {
       System.out.println("输入")
        }
}

  • 重启服务,查询服务是否正常发布。浏览器输入验证连接: 项目路径+/services/callCenterService?wsdl

客户端生成

通过java自带cxf生成命令

命令行运行(桌面执行即 xml文件对应的路径)

wsimport -encoding utf-8 -keep -p com.api.client.companyInfoMapping CompanyInfoMapping.xml

执行命令后生成对应的文件夹

通过Axis2生成

  1. 下载对应的文件
  2. 进入到bin目录下,用命令行执行
    wsdl2java.bat -p com.xview.cms.webservice.database -t -u -o bak -uri C:\Users\wangzhen\Desktop\CompanyInfoMappingService.xml
    执行命令后生成对应的文件夹

服务调用

  		JaxWsProxyFactoryBean factory = new JaxWsProxyFactoryBean();
        factory.setServiceClass(CompanyInfoMappingService.class);
        String webUrl = prpdConfigUrlApi.findUrl().get("webService");
        factory.setAddress(webUrl + "/webServices/CompanyInfoMappingService?wsdl".trim());
        CompanyInfoMappingService companyInfoMappingService = (CompanyInfoMappingService) factory.create();

        List<String> returnMapped = companyInfoMappingService.queryPlatMapInfo (comCodeList);
        LOGGER.info ("返回的机构信息为:{}",JSONObject.toJSONString (returnMapped));
        List<PrpDcompanyDto> respMapperComList = prpDcompanyDtoList.stream ().filter (prpDcompanyDto -> returnMapped.indexOf (prpDcompanyDto.getComCode ()) > -1).collect (Collectors.toList ());
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值