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

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

<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!
有更好的方案欢迎留言

  • 3
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 8
    评论
### 回答1: 使用 JAXB 生成 Java 实体需要按照以下步骤进行: 1. 在 pom.xml 中添加 JAXB 的依赖。 ``` <dependencies> <dependency> <groupId>javax.xml.bind</groupId> <artifactId>jaxb-api</artifactId> <version>2.3.1</version> </dependency> </dependencies> ``` 2. 创建一个包含 JAXB 注解的 Java 。 ``` import javax.xml.bind.annotation.XmlRootElement; @XmlRootElement public class Person { private String name; private int age; // 省略 getter 和 setter 方法 } ``` 3. 使用 JAXBXML 数据映射到 Java 实体。 ``` import javax.xml.bind.JAXBContext; import javax.xml.bind.Unmarshaller; // 读取 XML 文件 File file = new File("person.xml"); // 创建 JAXBContext 对象 JAXBContext jaxbContext = JAXBContext.newInstance(Person.class); // 创建 Unmarshaller 对象 Unmarshaller unmarshaller = jaxbContext.createUnmarshaller(); // 将 XML 数据转换为 Java 对象 Person person = (Person) unmarshaller.unmarshal(file); // 输出结果 System.out.println(person.getName()); System.out.println(person.getAge()); ``` 4. 使用 JAXBJava 实体转换为 XML 数据。 ``` import javax.xml.bind.JAXBContext; import javax.xml.bind.Marshaller; // 创建 Person 对象 Person person = new Person(); person.setName("张三"); person.setAge(20); // 创建 JAXBContext 对象 JAXBContext jaxbContext = JAXBContext.newInstance(Person.class); // 创建 Marshaller 对象 Marshaller marshaller = jaxbContext.createMarshaller(); // 将 Java 对象转换为 XML 数据 marshaller.marshal(person, new File("person.xml ### 回答2: Java中,JAXBJava Architecture for XML Binding)是一种用于将XML数据与Java对象进行绑定的技术。JAXB可以根据给定的XML数据自动生成Java实体的内容。 在使用JAXB时,我们需要先编写一个XSD(XML Schema Definition)文件,XSD文件定义了XML数据的结构和规则。然后,我们可以使用JAXB提供的工具将XSD文件转换为Java。 首先,我们需要导入JAXB相关的包,例如javax.xml.bind.annotation和javax.xml.bind.annotation.adapters等。 然后,我们可以使用JAXB提供的注解来进行定义。比如,使用@XmlRootElement注解来指定根元素,使用@XmlElement注解来指定元素,使用@XmlAttribute注解来指定属性等。 接下来,我们可以使用JAXB提供的工具来生成Java。可以通过命令行的方式执行xjc命令,将XSD文件转换为Java,也可以通过IDE工具中的插件或者菜单来完成这个过程。 生成Java将包含与XML数据对应的字段和方法。我们可以通过调用相关的getter和setter方法来访问和修改这些字段的值。 此外,JAXB还提供了一些其他的功能,例如将Java对象序列化成XML数据、将XML数据反序列化为Java对象等。 总之,使用JAXB可以根据给定的XML数据自动生成相应的Java实体内容,使得XML数据与Java对象之间的转换更加方便和简洁。 ### 回答3: Java使用JAXB可以根据XML数据自动生成实体内容。JAXBJava架构用于处理JavaXML之间的数据绑定和序列化的技术。使用JAXB可以根据XML的结构自动生成相应的Java,从而方便地在程序中使用XML数据。 在使用JAXB时,首先需要定义一个XML模式文档(XML Schema),该文档描述了XML数据的结构和约束。然后,使用JAXB提供的工具来生成Java。通过运行JAXB命令行工具或者使用maven插件,可以将XML模式文档转换为Java生成Java会根据XML的结构生成对应的属性(与XML元素对应),并提供相应的访问方法。同时,JAXB还可以根据XML中的属性生成对应的Java注解,进一步增强生成Java的功能。 使用JAXB生成的实体可以方便地进行XMLJava对象之间的互相转换,通过调用JAXB提供的方法,可以将XML数据转换为Java对象,或将Java对象转换为XML数据。在转换过程中,JAXB会自动完成对象属性与XML元素或属性之间的映射,无需开发人员手动解析XML数据。 总之,JAXB是一个强大的工具,可以根据XML数据自动生成实体内容,简化了JavaXML之间的数据绑定和序列化任务。使用JAXB可以减少在处理XML数据时的开发工作量,提高代码的可读性和可维护性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值