文章目录

  • 生成的请求报文与需要解析的响应报文
  • 使用Apache CXF或者jdk自带的wsimport生成客户端代码
  • 不生成客户端代码
  • 类的继承关系
  • 包结构与package-info.java
    • 将子类和父类的请求类都放在同一个包下
    • 在package-info.java配置XML的命名空间和前缀
  • 封装的SOAP请求类
    • 生成XML的工具类
    • 发送SOAP请求工具类
  • SOAP响应体
  • 测试
  • 总结

生成的请求报文与需要解析的响应报文

<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

<bindingsxmlns: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;}@XmlTransientpublic BaseQueryRequest getBaseQueryRequest() {return baseQueryRequest;}public void setBaseQueryRequest(BaseQueryRequest baseQueryRequest) {this.baseQueryRequest = baseQueryRequest;}@XmlTransientpublic 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() {@Overridepublic void checkClientTrusted(java.security.cert.X509Certificate[] paramArrayOfX509Certificate,String paramString) throws CertificateException {}@Overridepublic void checkServerTrusted(java.security.cert.X509Certificate[] paramArrayOfX509Certificate,String paramString) throws CertificateException {}@Overridepublic 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;@XmlTransientpublic AllResponse getBaseQueryResponse() {return baseQueryResponse;}public void setBaseQueryResponse(AllResponse baseQueryResponse) {this.baseQueryResponse = baseQueryResponse;}@XmlTransientpublic 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)
nullProcess finished with exit code 0

总结

看到这的估计都是苦逼党,我舒服了
愿世界不再有WebService, FUCK!
有更好的方案欢迎留言

JAXB根据带继承关系的类生成soap请求的XML报文(互转)相关推荐

  1. 在CMD窗口中使用javac和java命令进行编译和执行带有包名的具有继承关系的类

    一.背景 最近在使用记事本编写带有包名并且有继承关系的java代码并运行时发现出现了很多错误,经过努力一一被解决,今天我们来看一下会遇见哪些问题,并给出解决办法. 二.测试过程 1.父类代码 1 pa ...

  2. java中具有继承关系的类及其对象初始化顺序

    先说结论 对于具有继承关系的类,它们的类和对象构造顺序为:父类的类构造器() -> 子类的类构造器() -> 父类成员变量的赋值和实例代码块 -> 父类的构造函数 -> 子类成 ...

  3. java 继承对象 初始化_java中具有继承关系的类及其对象初始化顺序

    先说结论 对于具有继承关系的类,它们的类和对象构造顺序为:父类的类构造器() -> 子类的类构造器() -> 父类成员变量的赋值和实例代码块 -> 父类的构造函数 -> 子类成 ...

  4. 抽象类试验。定义一组具有继承关系的类。Shape(形状)类是一个抽象类,包含4个数据成员(坐标x,y,颜色c,图形对象g(Graphics类对象))

    package Test5_1_zxj; import javax.swing.*; import java.awt.*; public abstract class Shape {// 抽象类试验. ...

  5. python类的继承关系,python——类和类之间的关系(继承多态)

    1.类和类之间的关系有三种:is-a.has-a和use-a关系. is-a关系也叫继承或泛化,比如学生和人的关系.手机和电子产品的关系都属于继承关系. has-a关系通常称之为关联,比如部门和员工的 ...

  6. Java继承关系的类的初始化和实例化的执行顺序

    2019独角兽企业重金招聘Python工程师标准>>> 首先我们定义一个接口,如下: public interface People {String interfaceName = ...

  7. 关于类、抽象类和接口的继承关系

    关于类.抽象类和接口的继承关系 Java类的继承是单继承的,就是一个类只能继承一个类,但是可以通过接口来实现多继承,一个类可以实现多个接口.通过这种方式,Java类就可以实现多继承的关系.但是在继承类 ...

  8. java集合类继承关系图_java集合继承关系图

    面向对象语言对事物的体现都是以对象的形式,所以为了方便对多个对象的操作,就对对象进行存储,集合就是存储对象最常用的一种方式. 数组虽然也可以存储对象,但长度是固定的:集合长度是可变的,数组中可以存储基 ...

  9. python类与类的关系_python 类与类之间的关系

    一.依赖关系(紧密程度最低) (1)简单的定义:就是方法中传递一个对象.此时类与类之间存在依赖关系,此关系比较低. (2)实例植物大战僵尸简易版 题目要求:创建一个植物,创建一个僵尸 1.植物:名字. ...

最新文章

  1. 理解C语言中指针的声明以及复杂声明的语法
  2. django中模型类的创建
  3. MPICH 完整配置存档
  4. linux 实时 网口 速率_linux 下查看网卡工作速率-阿里云开发者社区
  5. C# ASP.NET MVC 图片上传的多种方式(存储至服务器文件夹,阿里云oss)
  6. Git操作失败并提示Another git process seems to be running in this......
  7. input中的name,value以及label中的for
  8. 如何解决“企业内控”存在的形式化问题
  9. 命令行管理sql server
  10. 一句话简单区分 SQL 连接
  11. MVC架构下,使用NPOI读取.DOCX文档中表格的内容
  12. 达梦数据库的学习使用
  13. 最新聚合支付系统+农信易扫/飞行模式+附APP
  14. Prometheus(监控报警系统) 的学习笔记
  15. 乐佰小迪智能机器人_助力产业升级,云知声 AI 陪伴教育机器人方案亮相广州国际玩具展...
  16. excel中条形图的条目排序与逆序
  17. rancher发布应用_Rancher 上线应用商店的基本流程
  18. ESP8266-Arduino编程实例-TMP175数字温度传感器驱动
  19. 浅尝辄止MongoDB:管理(1)
  20. Error creating bean with name ‘XXX‘: Injection of autowired dependencies failed解决办法

热门文章

  1. 搜索导航HTML,CSS 带搜索导航栏的示例代码
  2. DD马达与直线电机的特点和发展
  3. OCR——视觉会议调研
  4. 单机安装 hadoop 环境(Hadoop伪分布式安装)
  5. linux下格式化apfs,下一版 macOS High Sierra 将采用 APFS 文件系统
  6. mysql余额统计_实现按部门月卡余额总额分组统计的SQL查_mysql
  7. live555编译移植
  8. 你要明白的SQL优化
  9. 如何在sap里设置自定义打印纸张
  10. 最新版YOLOv6训练自己的数据集(超详细完整版!)