文章目录
生成的请求报文与需要解析的响应报文
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:web="http://webservice.cxf.csii.com/">
<soapenv:Header/>
<soapenv:Body>
<!--这里面的内容可以动态替换-->
<web:queryIssueOrgInfoList>
<chnlId>XXXX</chnlId>
<deptId>141</deptId>
<operatorId>XXXX</operatorId>
<pageNum>1</pageNum>
<pageSize>100</pageSize>
<reqSysId>XXXX</reqSysId>
<reqSysTime>202011191405</reqSysTime>
<reqTransCode>1</reqTransCode>
</web:queryIssueOrgInfoList>
</soapenv:Body>
</soapenv:Envelope>
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Body>
<ns2:responseBody xmlns:ns2="http://webservice.cxf.csii.com/">
<responseCode>00000</responseCode>
<responseMessage>交易成功</responseMessage>
<sourceSystem>XXXX</sourceSystem>
<totalNum>2</totalNum>
<issueOrgList>
<custDireCd>3</custDireCd>
<fincOrgCd>XXXX</fincOrgCd>
<issueOrgNm>XXXX</issueOrgNm>
<issueOrgNo>1111</issueOrgNo>
<issueOrgTpCd>03</issueOrgTpCd>
<uscc>XXXX</uscc>
</issueOrgList>
<issueOrgList>
<custDireCd>1</custDireCd>
<fincOrgCd>111</fincOrgCd>
<issueOrgNm>XXXX</issueOrgNm>
<issueOrgNo>1111</issueOrgNo>
<issueOrgTpCd>01</issueOrgTpCd>
<uscc>XXXX</uscc>
</issueOrgList>
</ns2:responseBody>
</soap:Body>
</soap:Envelope>
使用Apache CXF或者jdk自带的wsimport生成客户端代码
wsimport.exe -p com.pkyou.Sample.agent.ecif -encoding utf-8 -wsdllocation [wsdl路径(本地or远程)] -keep -b D:\src\binding.xml [wsdl路径同上] -s D:\src
binding.xml
<bindings
xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
wsdlLocation="[wsdl路径同上]"
xmlns="http://java.sun.com/xml/ns/jaxws">
<!-- Disable default wrapper style -->
<enableWrapperStyle>false</enableWrapperStyle>
</bindings>
不生成客户端代码
请求类上面添加
@XmlAccessorType(XmlAccessType.FIELD)
//name随便取 propOrder生成XML的顺序,写不写无所谓
@XmlType(name = "addPreProductRequest", propOrder = {
"certNo",
"certTpCd",
"certTpRmrk",
"custNm",
"custTpCd"
})
类的继承关系
包结构与package-info.java
将子类和父类的请求类都放在同一个包下
在package-info.java配置XML的命名空间和前缀
- request目录下的package-info.java
@javax.xml.bind.annotation.XmlSchema(xmlns={@javax.xml.bind.annotation.XmlNs(prefix="soapenv",namespaceURI="http://schemas.xmlsoap.org/soap/envelope/"),
@javax.xml.bind.annotation.XmlNs(prefix="web",namespaceURI="http://webservice.cxf.csii.com/")})
package com.pkyou.Sample.agent.ecif.request;
- response目录下的package-info.java
@javax.xml.bind.annotation.XmlSchema(xmlns={@javax.xml.bind.annotation.XmlNs(prefix="soap",namespaceURI="http://schemas.xmlsoap.org/soap/envelope/")
,@javax.xml.bind.annotation.XmlNs(prefix="",namespaceURI="http://webservice.cxf.csii.com/")})
package com.pkyou.Sample.agent.ecif.response;
封装的SOAP请求类
package com.pkyou.Sample.entity.request;
import com.pkyou.Sample.agent.ecif.request.SoapBody;
import com.pkyou.Sample.agent.ecif.request.SoapHeader;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.ToString;
import org.springframework.boot.test.context.TestComponent;
import javax.xml.bind.annotation.*;
/**
* @author luzh32717
* @version 1.0
* @date 2020/11/23 21:39
*/
@XmlRootElement(name = "Envelope",namespace = "http://schemas.xmlsoap.org/soap/envelope/")
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(propOrder = {
"header",
"body"
})
@Data
@NoArgsConstructor
@AllArgsConstructor
@ToString
public class SoapRequest {
@XmlElement(name = "Header",namespace = "http://schemas.xmlsoap.org/soap/envelope/")
SoapHeader header;
@XmlElement(name = "Body",namespace = "http://schemas.xmlsoap.org/soap/envelope/")
SoapBody body;
public SoapRequest(SoapBody body) {
this.header = new SoapHeader();
this.body = body;
}
}
package com.pkyou.Sample.agent.ecif.request;
import lombok.NoArgsConstructor;
/**
* @author luzh32717
* @version 1.0
* @date 2020/11/23 22:00
*/
@NoArgsConstructor
public class SoapHeader {
}
package com.pkyou.Sample.agent.ecif.request;
import lombok.NoArgsConstructor;
import javax.xml.bind.annotation.*;
/**
* @author luzh32717
* @version 1.0
* @date 2020/11/23 22:00
*/
@NoArgsConstructor
public class SoapBody {
@XmlElements({ @XmlElement(name="queryOrgDetailedInfo",type = QueryOrgDetailedInfoRequest.class,namespace = "http://webservice.cxf.csii.com/"),
@XmlElement(name="queryPersonDetailedInfoJzyg",type = QueryPersonDetailedInfoJzygRequest.class,namespace = "http://webservice.cxf.csii.com/"),
@XmlElement(name="queryIssueOrgInfoList",type = QueryIssueOrgInfoListRequest.class,namespace = "http://webservice.cxf.csii.com/"),
@XmlElement(name="queryProductDetailedInfo",type = QueryProductDetailedInfoRequest.class,namespace = "http://webservice.cxf.csii.com/"),
@XmlElement(name="queryIssueOrgDetailedInfo",type = QueryIssueOrgDetailedInfoRequest.class,namespace = "http://webservice.cxf.csii.com/"),
@XmlElement(name="queryCustInfoList",type = QueryCustInfoListRequest.class,namespace = "http://webservice.cxf.csii.com/"),
@XmlElement(name="queryPersonDetailedInfo",type = QueryPersonDetailedInfoRequest.class,namespace = "http://webservice.cxf.csii.com/")
})
BaseQueryRequest baseQueryRequest;
@XmlElements({ @XmlElement(name="handlePersonElectronic",type = HandlePersonElectronicRequest.class,namespace = "http://webservice.cxf.csii.com/"),
@XmlElement(name="addProduct",type = AddProductRequest.class,namespace = "http://webservice.cxf.csii.com/"),
@XmlElement(name="updatePersonInfo",type = UpdatePersonInfoRequest.class,namespace = "http://webservice.cxf.csii.com/"),
@XmlElement(name="updateOrgInfo",type = UpdateOrgInfoRequest.class,namespace = "http://webservice.cxf.csii.com/"),
@XmlElement(name="addPrePerson",type = AddPrePersonRequest.class,namespace = "http://webservice.cxf.csii.com/"),
@XmlElement(name="handleProductElectronic",type = HandleProductElectronicRequest.class,namespace = "http://webservice.cxf.csii.com/"),
@XmlElement(name="addPerson",type = AddPersonRequest.class,namespace = "http://webservice.cxf.csii.com/"),
@XmlElement(name="updateIssueOrgInfo",type = UpdateIssueOrgInfoRequest.class,namespace = "http://webservice.cxf.csii.com/"),
@XmlElement(name="addPreOrg",type = AddPreOrgRequest.class,namespace = "http://webservice.cxf.csii.com/"),
@XmlElement(name="addPrePersonJzyg",type = AddPrePersonJzygRequest.class,namespace = "http://webservice.cxf.csii.com/"),
@XmlElement(name="addPersonJzyg",type = AddPersonJzygRequest.class,namespace = "http://webservice.cxf.csii.com/"),
@XmlElement(name="handleOrgElectronic",type = HandleOrgElectronicRequest.class,namespace = "http://webservice.cxf.csii.com/"),
@XmlElement(name="addOrg",type = AddOrgRequest.class,namespace = "http://webservice.cxf.csii.com/"),
@XmlElement(name="updateProductInfo",type = UpdateProductInfoRequest.class,namespace = "http://webservice.cxf.csii.com/"),
})
BasePostRequest basePostRequest;
public SoapBody(BaseQueryRequest baseQueryRequest) {
this.baseQueryRequest = baseQueryRequest;
}
public SoapBody(BasePostRequest basePostRequest) {
this.basePostRequest = basePostRequest;
}
@XmlTransient
public BaseQueryRequest getBaseQueryRequest() {
return baseQueryRequest;
}
public void setBaseQueryRequest(BaseQueryRequest baseQueryRequest) {
this.baseQueryRequest = baseQueryRequest;
}
@XmlTransient
public BasePostRequest getBasePostRequest() {
return basePostRequest;
}
public void setBasePostRequest(BasePostRequest basePostRequest) {
this.basePostRequest = basePostRequest;
}
}
生成XML的工具类
package com.pkyou.Sample.util;
import com.pkyou.Sample.agent.ecif.response.*;
import com.pkyou.Sample.entity.response.SoapResponse;
import org.apache.commons.io.input.XmlStreamReader;
import javax.xml.bind.*;
import javax.xml.stream.XMLStreamReader;
import java.io.*;
/**
* @author luzh32717
* @version 1.0
* @date 2020/11/23 18:01
*/
public class XmlUtil {
public static final String DEFAULT_ENCODING = "UTF-8";
/**
* pojo转换成xml 默认编码UTF-8
*
* @param obj 待转化的对象
* @return xml格式字符串
* @throws Exception JAXBException
*/
public static String convertToXml(Object obj) throws Exception {
return convertToXml(obj, DEFAULT_ENCODING);
}
/**
* pojo转换成xml 默认编码UTF-8
* @param output 待转化的字符串
* @param parent 基类
* @return 对象
* @throws Exception JAXBException
*/
public static<T> T convertToObject(String output,Class<T> parent) throws Exception {
JAXBContext context = JAXBContext.newInstance(parent);
Unmarshaller unmarshaller = context.createUnmarshaller();
return (T) unmarshaller.unmarshal(new StringReader(output));
}
/**
* pojo转换成xml
*
* @param obj 待转化的对象
* @param encoding 编码
* @return xml格式字符串
* @throws Exception JAXBException
*/
public static String convertToXml(Object obj, String encoding) throws Exception {
String result = null;
JAXBContext context = JAXBContext.newInstance(obj.getClass());
Marshaller marshaller = context.createMarshaller();
// 去除XML头
marshaller.setProperty("com.sun.xml.bind.xmlDeclaration", Boolean.FALSE);
// 指定是否使用换行和缩排对已编组 XML 数据进行格式化的属性名称。
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
marshaller.setProperty(Marshaller.JAXB_ENCODING, encoding);
StringWriter writer = new StringWriter();
marshaller.marshal(obj, writer);
result = writer.toString();
return result;
}
public static void main(String[] args) throws Exception {
}
}
// marshaller.setProperty("com.sun.xml.bind.namespacePrefixMapper", new NamespacePrefixMapper() {
// @Override
// public String getPreferredPrefix(String namespaceUri, String suggestion, boolean requirePrefix) {
// if (namespaceUri.equals("http://webservice.cxf.csii.com")){
// return "web";
// }
if (namespaceUri.contains("http://www.cnblogs.com")){
return "blog";
}
// return suggestion;
// }
// });
发送SOAP请求工具类
package com.pkyou.Sample.util;
import com.pkyou.Sample.agent.ecif.response.*;
import com.pkyou.Sample.common.CommonResult;
import com.pkyou.Sample.common.Result;
import com.pkyou.Sample.entity.configs.CMBToken;
import com.pkyou.Sample.entity.response.SoapResponse;
import com.pkyou.Sample.util.FrameUtil.FrameJsonUtil;
import org.apache.http.HttpEntity;
import org.apache.http.client.HttpClient;
import org.apache.http.client.config.RequestConfig;
import org.apache.http.client.methods.*;
import org.apache.http.config.Registry;
import org.apache.http.config.RegistryBuilder;
import org.apache.http.conn.socket.ConnectionSocketFactory;
import org.apache.http.conn.socket.PlainConnectionSocketFactory;
import org.apache.http.conn.ssl.NoopHostnameVerifier;
import org.apache.http.conn.ssl.SSLConnectionSocketFactory;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.impl.conn.PoolingHttpClientConnectionManager;
import org.apache.http.util.EntityUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import javax.net.ssl.SSLContext;
import javax.net.ssl.TrustManager;
import javax.net.ssl.X509TrustManager;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.nio.charset.Charset;
import java.security.KeyManagementException;
import java.security.NoSuchAlgorithmException;
import java.security.cert.CertificateException;
import java.text.SimpleDateFormat;
import java.util.*;
/**
* @author luzh32717
* @version 1.0
* @date 2020/11/23 18:01
*/
public class HttpUtil {
private static final Logger LOGGER = LoggerFactory.getLogger(HttpUtil.class);
private static final int HTTP_CONNECT_TIMEOUT = 5000;
private static final int HTTP_CONNECTION_REQUEST_TIMEOUT = 60000;
private static final int HTTP_SOCKET_TIMEOUT = 60000;
/**
* ESB地址
*/
public static final String ESB_URL ="";
/**
* ESBHeader
*/
public static final String ESB_HEADER ="";
/**
* ESBHeader value
*/
public static final String ESB_HEADER_VALUE ="";
private static SSLContext createIgnoreVerifySSL() throws NoSuchAlgorithmException, KeyManagementException {
SSLContext sc = SSLContext.getInstance("SSLv3");
// 实现一个X509TrustManager接口,用于绕过验证,不用修改里面的方法
X509TrustManager trustManager = new X509TrustManager() {
@Override
public void checkClientTrusted(java.security.cert.X509Certificate[] paramArrayOfX509Certificate,
String paramString) throws CertificateException {
}
@Override
public void checkServerTrusted(java.security.cert.X509Certificate[] paramArrayOfX509Certificate,
String paramString) throws CertificateException {
}
@Override
public java.security.cert.X509Certificate[] getAcceptedIssuers() {
return null;
}
};
sc.init(null, new TrustManager[] { trustManager }, null);
return sc;
}
/**
* 创建支持http和https的请求
* @return
*/
private static CloseableHttpClient createSSLClientDefault() {
try {
// 采用绕过验证的方式处理https请求
SSLContext sslcontext = createIgnoreVerifySSL();
// 设置协议http和https对应的处理socket链接工厂的对象
SSLConnectionSocketFactory socketFactory = new SSLConnectionSocketFactory(sslcontext, NoopHostnameVerifier.INSTANCE);
Registry<ConnectionSocketFactory> socketFactoryRegistry = RegistryBuilder.<ConnectionSocketFactory>create()
.register("http", PlainConnectionSocketFactory.INSTANCE)
.register("https",socketFactory)
.build();
PoolingHttpClientConnectionManager connManager = new PoolingHttpClientConnectionManager(
socketFactoryRegistry);
HttpClients.custom().setConnectionManager(connManager);
// 创建自定义的httpclient对象
return HttpClients.custom().setConnectionManager(connManager).build();
} catch (Exception e) {
e.printStackTrace();
}
return HttpClients.createDefault();
}
public static SoapResponse sendSoapRequest(String input) throws IOException {
//创建http Post请求
CloseableHttpClient httpClient = createSSLClientDefault();
RequestConfig requestConfig = RequestConfig.custom()
.setConnectTimeout(HTTP_CONNECT_TIMEOUT).setConnectionRequestTimeout(HTTP_CONNECTION_REQUEST_TIMEOUT)
.setSocketTimeout(HTTP_SOCKET_TIMEOUT).build();
HttpPost httpPost = new HttpPost(ESB_URL);
httpPost.setConfig(requestConfig);
//采用SOAP1.1调用服务端,这种方式能调用服务端为soap1.1和soap1.2的服务
httpPost.setHeader("Content-Type", "text/xml;charset=UTF-8");
StringEntity stringEntity = new StringEntity(input, Charset.forName("UTF-8"));
httpPost.setEntity(stringEntity);
httpPost.setHeader(ESB_HEADER,ESB_HEADER_VALUE);
CloseableHttpResponse response = httpClient.execute(httpPost);;
try {
HttpEntity entity = response.getEntity();
String result = EntityUtils.toString(entity, "UTF-8");
LOGGER.debug(result);
if(result!=null && !result.trim().equals("")){
return XmlUtil.convertToObject(result, SoapResponse.class);
}
} catch (Exception e) {
LOGGER.error("异常" + e.getMessage(), e);
} finally {
response.close();
httpClient.close();
}
return new SoapResponse(SoapResponseBody.getFailResponse());
}
}
SOAP响应体
响应体的封装大同小异,但是响应体不能动态绑定到子类上,目前的解决方案是把所有子类中的属性复制到一个类AllResponse中,然后再根据属性复制到自己需要的响应类中
package com.pkyou.Sample.entity.response;
import com.fasterxml.jackson.databind.ser.Serializers;
import com.pkyou.Sample.agent.ecif.response.BaseResponse;
import com.pkyou.Sample.agent.ecif.response.SoapResponseBody;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.ToString;
import javax.xml.bind.annotation.*;
/**
* @author luzh32717
* @version 1.0
* @date 2020/11/24 10:44
*/
@XmlRootElement(name = "Envelope",namespace = "http://schemas.xmlsoap.org/soap/envelope/")
@XmlAccessorType(XmlAccessType.FIELD)
@Data
@NoArgsConstructor
@AllArgsConstructor
@ToString
public class SoapResponse{
public static final String SUCCEED_CODE = "00000";
@XmlElement(name = "Body",namespace = "http://schemas.xmlsoap.org/soap/envelope/")
SoapResponseBody soapResponseBody;
public static Boolean isSuccess(SoapResponse soapResponse){
if (soapResponse==null) {
return false;
}
SoapResponseBody soapResponseBody = soapResponse.getSoapResponseBody();
return soapResponseBody!=null
&& soapResponseBody.getFailSoapResponseBody() == null
&& soapResponseBody.getBaseQueryResponse() != null
&& soapResponseBody.getBaseQueryResponse().getResponseCode() != null
&& soapResponseBody.getBaseQueryResponse().getResponseCode().equals(SUCCEED_CODE);
// && soapResponseBody.getBaseQueryResponse().getTotalNum() != 0 ;
}
}
package com.pkyou.Sample.agent.ecif.response;
import com.pkyou.Sample.agent.ecif.request.*;
import lombok.AllArgsConstructor;
import lombok.NoArgsConstructor;
import lombok.ToString;
import javax.xml.bind.annotation.*;
/**
* @author luzh32717
* @version 1.0
* @date 2020/11/24 10:47
*/
@ToString
public class SoapResponseBody{
// @XmlElementRefs({
// @XmlElementRef(name = "responseBody",type = QueryIssueOrgInfoListResponseO.class, namespace = "http://webservice.cxf.csii.com/"),
// @XmlElementRef(name = "responseBody",type = QueryIssueOrgDetailedInfoResponseO.class, namespace = "http://webservice.cxf.csii.com/")
// })
@XmlElement(name = "responseBody",namespace = "http://webservice.cxf.csii.com/")
AllResponse baseQueryResponse;
@XmlElement(name = "Fault",namespace = "http://schemas.xmlsoap.org/soap/envelope/")
FailSoapResponseBody failSoapResponseBody;
@XmlTransient
public AllResponse getBaseQueryResponse() {
return baseQueryResponse;
}
public void setBaseQueryResponse(AllResponse baseQueryResponse) {
this.baseQueryResponse = baseQueryResponse;
}
@XmlTransient
public FailSoapResponseBody getFailSoapResponseBody() {
return failSoapResponseBody;
}
public void setFailSoapResponseBody(FailSoapResponseBody failSoapResponseBody) {
this.failSoapResponseBody = failSoapResponseBody;
}
public SoapResponseBody() {
}
public static SoapResponseBody getFailResponse(){
SoapResponseBody soapResponseBody = new SoapResponseBody();
soapResponseBody.setFailSoapResponseBody(FailSoapResponseBody.getFailResponse());
return soapResponseBody;
}
}
package com.pkyou.Sample.agent.ecif.response;
import com.pkyou.Sample.agent.ecif.request.IssueOrg;
import com.pkyou.Sample.agent.ecif.request.RelpRelTpInfoO;
import com.pkyou.Sample.util.MyBeanUtil;
import lombok.Data;
import lombok.ToString;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;
/**
* SOAP的responseBody
* 后面我觉得可以用注解+反射动态给这个类添加字段
* @author luzh32717
* @version 1.0
* @date 2020/11/27 11:10
*/
@Data
@ToString
@XmlAccessorType(XmlAccessType.FIELD)
@XmlRootElement(name = "responseBody")
public class AllResponse extends BaseResponse{
/**
* 允许转化的类型
*/
protected List<Class<?>> allowTypes;
public AllResponse() {
allowTypes=new ArrayList<>();
allowTypes.add(QueryIssueOrgDetailedInfoResponseO.class);
allowTypes.add(QueryIssueOrgInfoListResponseO.class);
allowTypes.add(BaseResponse.class);
}
/**
* 所有需要的属性
*/
protected String abroadComncAddr;
protected String abroadRgstAddr;
protected String busiScp;
protected String certTrmofvalidBegDt;
protected String certTrmofvalidExpDt;
protected String comncAddrCntryOrAreaCd;
protected String custDireCd;
protected String estbDt;
protected String fincOrgCd;
@XmlElement(name = "HShareActlCtlrCatCd")
protected String hShareActlCtlrCatCd;
@XmlElement(name = "HShareActlCtlrCertBegDt")
protected String hShareActlCtlrCertBegDt;
@XmlElement(name = "HShareActlCtlrCertExpDt")
protected String hShareActlCtlrCertExpDt;
@XmlElement(name = "HShareActlCtlrCertNo")
protected String hShareActlCtlrCertNo;
@XmlElement(name = "HShareActlCtlrCertTpCd")
protected String hShareActlCtlrCertTpCd;
@XmlElement(name = "HShareActlCtlrNatCd")
protected String hShareActlCtlrNatCd;
@XmlElement(name = "HShareActlCtlrNm")
protected String hShareActlCtlrNm;
protected String inbrdComncAddrCd;
protected String inbrdDtlComncAddr;
protected String inbrdDtlRgstAddr;
protected String inbrdRgstAddrCd;
protected String instkTm;
protected String isCoRelp;
protected String issueOrgIsAlrdyinstk;
protected String issueOrgNm;
protected String issueOrgNo;
protected String issueOrgShrtNm;
protected String issueOrgTpCd;
protected String legalPsnPrinCertBegDt;
protected String legalPsnPrinCertExpDt;
protected String legalPsnPrinCertNo;
protected String legalPsnPrinCertTpCd;
protected String legalPsnPrinNatCd;
protected String legalPsnPrinNm;
protected BigDecimal realIncmCptl;
@XmlElement(nillable = true)
protected List<RelpRelTpInfoO> relpRelTpInfoList;
protected String rgstCntryOrAreaCd;
protected String uscc;
@XmlElement(nillable = true)
protected List<IssueOrg> issueOrgList;
public List<IssueOrg> getIssueOrgList() {
if (issueOrgList == null) {
issueOrgList = new ArrayList<IssueOrg>();
}
return this.issueOrgList;
}
/**
* 将AllResponse转换成allowType列表中的Response
* @param type 类型
* @return obj
* @throws Exception 异常
*/
public Object castResponse(Object type) throws Exception {
Class<?> aClass = type.getClass();
if(!allowTypes.contains(aClass)){
throw new Exception("该对象类型不允许被转换");
}
return MyBeanUtil.copy(this,type);
}
public Object castResponse(Object type) throws Exception {
Class<?> aClass = type.getClass();
if(!allowTypes.contains(aClass)){
throw new Exception("该对象类型不允许被转换");
}
return MyBeanUtil.copy(this,type);
}
}
package com.pkyou.Sample.util;
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.hundsun.t2sdk.interfaces.share.dataset.IDataset;
import com.pkyou.Sample.ServiceImp.TAService;
import com.pkyou.Sample.common.CommonException;
import io.swagger.models.auth.In;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.IOException;
import java.lang.reflect.Field;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
/**
* bean相关的工具类
* @author luzh32717
* @date 2020/10/14 9:36
* @version 1.0
*/
public class MyBeanUtil {
private static final Logger LOGGER = LoggerFactory.getLogger(MyBeanUtil.class);
/**
* 复制属性相同的两个类, 前提是两个类都重载了setter/getter方法
* @param source 源类
* @param target 目标类
* @return T 目标类型
* @throws CommonException 公共异常
*/
public static<T> T copy(Object source,T target) throws CommonException {
if(source == null || target == null){
throw new CommonException("-1","同属性bean复制时入参不能为空!");
}
Field[] declaredFields = getAllFields(source);
// Field[] declaredFields = source.getClass().getDeclaredFields();
Class<?> targetClass = target.getClass();
if(declaredFields.length <= 0 || targetClass.getDeclaredFields().length <=0 ){
throw new CommonException("-1","同属性bean复制时入参违法!");
}
for(Field declaredField : declaredFields){
declaredField.setAccessible(true);
Field targetField = null;
try {
targetField = targetClass.getDeclaredField(declaredField.getName());
targetField.setAccessible(true);
if(targetField.getType().equals(declaredField.getType())){
targetField.set(target,declaredField.get(source));
}
} catch (NoSuchFieldException e) {
LOGGER.debug(declaredField.getName()+"没找到");
} catch (IllegalAccessException e){
throw new CommonException("-1","同属性bean复制时: " + e.getMessage());
}
}
return target;
}
public static Field[] getAllFields(Object object){
Class clazz = object.getClass();
List<Field> fieldList = new ArrayList<>();
while (clazz != null){
fieldList.addAll(new ArrayList<>(Arrays.asList(clazz.getDeclaredFields())));
clazz = clazz.getSuperclass();
}
Field[] fields = new Field[fieldList.size()];
fieldList.toArray(fields);
return fields;
}
public static void main(String[] args) throws CommonException {
}
}
测试
public static void main(String[] args) throws Exception {
QueryIssueOrgInfoListRequest queryIssueOrgInfoListRequest = new QueryIssueOrgInfoListRequest();
// todo 设置参数
String s = XmlUtil.convertToXml(new SoapRequest(new SoapBody(queryIssueOrgInfoListRequest)));
System.out.println(s);
SoapResponse soapResponse = HttpUtil.sendSoapRequest(s);
AllResponse allResponse = soapResponse.getSoapResponseBody().getBaseQueryResponse();
if(SoapResponse.isSuccess(soapResponse)){
QueryIssueOrgInfoListResponseO o = (QueryIssueOrgInfoListResponseO)allResponse.castResponse(new QueryIssueOrgInfoListResponseO());
System.out.println(o);
}else{
System.out.println(allResponse.castResponse(new BaseResponse()));
System.out.println(soapResponse.getSoapResponseBody().getFailSoapResponseBody());
}
}
输出
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:web="http://webservice.cxf.csii.com/">
<soapenv:Header/>
<soapenv:Body>
<web:queryIssueOrgInfoList/>
</soapenv:Body>
</soapenv:Envelope>
16:50:08.589 [main] DEBUG com.pkyou.Sample.util.MyBeanUtil - allowTypes没找到
16:50:08.589 [main] DEBUG com.pkyou.Sample.util.MyBeanUtil - abroadComncAddr没找到
16:50:08.589 [main] DEBUG com.pkyou.Sample.util.MyBeanUtil - abroadRgstAddr没找到
16:50:08.590 [main] DEBUG com.pkyou.Sample.util.MyBeanUtil - busiScp没找到
16:50:08.590 [main] DEBUG com.pkyou.Sample.util.MyBeanUtil - certTrmofvalidBegDt没找到
16:50:08.590 [main] DEBUG com.pkyou.Sample.util.MyBeanUtil - certTrmofvalidExpDt没找到
16:50:08.590 [main] DEBUG com.pkyou.Sample.util.MyBeanUtil - comncAddrCntryOrAreaCd没找到
16:50:08.590 [main] DEBUG com.pkyou.Sample.util.MyBeanUtil - custDireCd没找到
16:50:08.590 [main] DEBUG com.pkyou.Sample.util.MyBeanUtil - estbDt没找到
16:50:08.590 [main] DEBUG com.pkyou.Sample.util.MyBeanUtil - fincOrgCd没找到
16:50:08.590 [main] DEBUG com.pkyou.Sample.util.MyBeanUtil - hShareActlCtlrCatCd没找到
16:50:08.590 [main] DEBUG com.pkyou.Sample.util.MyBeanUtil - hShareActlCtlrCertBegDt没找到
16:50:08.590 [main] DEBUG com.pkyou.Sample.util.MyBeanUtil - hShareActlCtlrCertExpDt没找到
16:50:08.590 [main] DEBUG com.pkyou.Sample.util.MyBeanUtil - hShareActlCtlrCertNo没找到
16:50:08.590 [main] DEBUG com.pkyou.Sample.util.MyBeanUtil - hShareActlCtlrCertTpCd没找到
16:50:08.590 [main] DEBUG com.pkyou.Sample.util.MyBeanUtil - hShareActlCtlrNatCd没找到
16:50:08.590 [main] DEBUG com.pkyou.Sample.util.MyBeanUtil - hShareActlCtlrNm没找到
16:50:08.590 [main] DEBUG com.pkyou.Sample.util.MyBeanUtil - inbrdComncAddrCd没找到
16:50:08.590 [main] DEBUG com.pkyou.Sample.util.MyBeanUtil - inbrdDtlComncAddr没找到
16:50:08.590 [main] DEBUG com.pkyou.Sample.util.MyBeanUtil - inbrdDtlRgstAddr没找到
16:50:08.590 [main] DEBUG com.pkyou.Sample.util.MyBeanUtil - inbrdRgstAddrCd没找到
16:50:08.590 [main] DEBUG com.pkyou.Sample.util.MyBeanUtil - instkTm没找到
16:50:08.590 [main] DEBUG com.pkyou.Sample.util.MyBeanUtil - isCoRelp没找到
16:50:08.590 [main] DEBUG com.pkyou.Sample.util.MyBeanUtil - issueOrgIsAlrdyinstk没找到
16:50:08.590 [main] DEBUG com.pkyou.Sample.util.MyBeanUtil - issueOrgNm没找到
16:50:08.590 [main] DEBUG com.pkyou.Sample.util.MyBeanUtil - issueOrgNo没找到
16:50:08.590 [main] DEBUG com.pkyou.Sample.util.MyBeanUtil - issueOrgShrtNm没找到
16:50:08.590 [main] DEBUG com.pkyou.Sample.util.MyBeanUtil - issueOrgTpCd没找到
16:50:08.590 [main] DEBUG com.pkyou.Sample.util.MyBeanUtil - legalPsnPrinCertBegDt没找到
16:50:08.590 [main] DEBUG com.pkyou.Sample.util.MyBeanUtil - legalPsnPrinCertExpDt没找到
16:50:08.591 [main] DEBUG com.pkyou.Sample.util.MyBeanUtil - legalPsnPrinCertNo没找到
16:50:08.591 [main] DEBUG com.pkyou.Sample.util.MyBeanUtil - legalPsnPrinCertTpCd没找到
16:50:08.591 [main] DEBUG com.pkyou.Sample.util.MyBeanUtil - legalPsnPrinNatCd没找到
16:50:08.591 [main] DEBUG com.pkyou.Sample.util.MyBeanUtil - legalPsnPrinNm没找到
16:50:08.591 [main] DEBUG com.pkyou.Sample.util.MyBeanUtil - realIncmCptl没找到
16:50:08.591 [main] DEBUG com.pkyou.Sample.util.MyBeanUtil - relpRelTpInfoList没找到
16:50:08.591 [main] DEBUG com.pkyou.Sample.util.MyBeanUtil - rgstCntryOrAreaCd没找到
16:50:08.591 [main] DEBUG com.pkyou.Sample.util.MyBeanUtil - uscc没找到
16:50:08.591 [main] DEBUG com.pkyou.Sample.util.MyBeanUtil - issueOrgList没找到
BaseResponse(globalSeqNo=null, responseCode=C7999, responseMessage=[chnlId]是必输项, sourceSystem=ECIF, totalNum=null, txnId=null)
null
Process finished with exit code 0
总结
看到这的估计都是苦逼党,我舒服了
愿世界不再有WebService, FUCK!
有更好的方案欢迎留言