JaxB: установить xsi: type и xmlns: q1 для запроса объекта - PullRequest
0 голосов
/ 26 сентября 2019

Я хочу, чтобы мой xml выглядел так:

                <data xsi:type="q1:UniversalLicenseRequest" xmlns:q1="http://integration.elicense.kz/CustomServices/Egov/EgovLicenseSearchService">
                    <q1:PageIndex>0</q1:PageIndex>
                    <q1:PageSize>10</q1:PageSize>
                    <q1:SystemInfo>
                        <q1:MessageId>a62ba0f1-5b3e-4c35-862d-032e9cdcfb68</q1:MessageId>
                        <q1:ChainId>162d9c25-8734-4fef-81d4-22dd5621e36e</q1:ChainId>
                        <q1:MessageDate>2019-01-18T10:00:49.7229311+06:00</q1:MessageDate>
                        <q1:MessageType>Request</q1:MessageType>
                        <q1:SignatureType>None</q1:SignatureType>
                    </q1:SystemInfo>
                    <q1:IinBin>921203350262</q1:IinBin> 
                    <q1:IssueDate xsi:nil="true"/>
                </data>

Вот мой класс UniversalLicenseRequest:

 @XmlAccessorType(XmlAccessType.FIELD)
 @XmlType(name = "UniversalLicenseRequest", propOrder = {
"iinBin",
"rnn",
"numberNikadUinrd",
"issueDate",
"activityCodes"
 })
public class UniversalLicenseRequest
       extends RequestPageBase
{
@XmlElement(name = "IinBin")
protected String iinBin;
@XmlElement(name = "Rnn")
protected String rnn;
@XmlElement(name = "NumberNikadUinrd")
protected String numberNikadUinrd;
@XmlElement(name = "IssueDate", required = true, nillable = true)
@XmlSchemaType(name = "dateTime")
protected XMLGregorianCalendar issueDate;
@XmlElement(name = "ActivityCodes")
protected String activityCodes;
@XmlElement(name = "SystemInfo")
protected SystemInfo systemInfo;
... getters and setters

А вот класс SystemInfo:

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "SystemInfo", propOrder = {
"messageId",
"chainId",
"messageDate",
"messageType",
"serviceId",
"responseCode",
"additionalInfo",
"senderId",
"digitalSignature",
"signatureType"
})
public class SystemInfo {

@XmlElement(name = "MessageId")
protected String messageId;
@XmlElement(name = "ChainId")
protected String chainId;
@XmlElement(name = "MessageDate", required = true)
@XmlSchemaType(name = "dateTime")
protected XMLGregorianCalendar messageDate; 
.....

Вот метод, который создает и отправляет запрос (Он написан на Kotlin, но я надеюсь, что вы понимаете это):

    private fun makeRequest(_iinBin: String, message_id: String): Document {
    val request = kz.esb.elicense.model.UniversalLicenseRequest().apply {
        pageIndex = 0
        pageSize = 10
        systemInfo = SystemInfo().apply {
            messageId = message_id
            messageDate = CalendarUtils.currentXMLGregorianCalendar()
            messageType = MessageType.REQUEST
            signatureType = DigitalSignatureType.NONE
        }
        iinBin = _iinBin
    }

    val document = DocumentBuilderFactory.newInstance().apply {
        isNamespaceAware = true
    }.newDocumentBuilder().newDocument()

    val jaxbElement = JAXBElement<kz.esb.elicense.model.UniversalLicenseRequest>(QName("http://integration.elicense.kz/CustomServices/Egov/EgovLicenseSearchService", "UniversalLicenseRequest"),
            kz.esb.elicense.model.UniversalLicenseRequest::class.java,
            request)
    val marshaller = JAXBContext.newInstance(kz.esb.elicense.model.UniversalLicenseRequest::class.java).createMarshaller()
    marshaller.marshal(jaxbElement, document)
    return document
}

Но в итоге мой запрос выглядит так:

 <data              xmlns:ns2="http://integration.elicense.kz/CustomServices/Egov/EgovLicenseSearchService">
                    <SystemInfo>
                        <MessageId>dad59a9c-60ba-4d76-94f2-30918ee5fb4c</MessageId>
                        <MessageDate>2019-09-26T12:43:21.624+06:00</MessageDate>
                        <MessageType>Request</MessageType>
                        <SignatureType>None</SignatureType>
                    </SystemInfo>
                    <PageIndex>0</PageIndex>
                    <PageSize>10</PageSize>
                    <IinBin>971240002363</IinBin>
                    <IssueDate
                        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:nil="true"/>
                    </data>

РЕДАКТИРОВАТЬ:

makeRequest метод называется как:

val request = RequestData().apply {
                data = makeRequest(_iinBin = bin, message_id = message_id).firstChild
            }

И RequestData класс выглядит следующим образом:

   @XmlSeeAlso({
    UniversalLicenseRequest.class,
   })
   public class RequestData
    implements Serializable {

    protected Object data;

Как видите, data поле просто Объект.После этого я отправляю сообщение:

    val response = webServiceTemplate.marshalSendAndReceive(serviceLocation, request) 
...