Один POJO, но другое имя XmlRootElement - PullRequest
0 голосов
/ 02 апреля 2020

Например, у меня есть один POJO, как показано ниже, но он подает несколько операций, но я не хочу создавать несколько идентичных POJO только потому, что имя элемента root изменяется для каждой операции. Следовательно, мне нужен один POJO, но таким образом, чтобы я мог динамически изменять Root Имя элемента.

@ToString
@MappedSuperclass
@lombok.Data
@XmlRootElement
@XmlAccessorType(XmlAccessType.NONE)
@EqualsAndHashCode(callSuper = false)
public class AmountOrAccountBlockOrUnblockRequest extends XmlBuilder implements SessionGenerator {

    @JsonIgnore
    @XmlElement
    private String TargetBankVerificationNumber;

    @JsonIgnore
    @XmlElement
    private String Narration;

    @JsonProperty("amount")
    @XmlElement(name = "Amount")
    private String amount;

    @JsonProperty("savingAccountNumber")
    @XmlElement(name = "TargetAccountNumber")
    private String targetAccountNumber;

    @JsonIgnore
    @XmlElement
    private String ChannelCode;

    @JsonProperty("unblockId")
    @JsonIgnore
    @XmlElement
    private String ReferenceCode;

    @JsonIgnore
    @XmlElement
    private String DestinationInstitutionCode;

    @JsonIgnore
    @XmlElement
    private String TargetAccountName;

    @XmlElement
    private String SessionID;

    @JsonIgnore
    @XmlElement
    private String ReasonCode;

    // if account is still blocked or released
    @JsonProperty("block")
    private boolean blockUnblock;

    @JsonProperty("blockUnblockReason")
    private String blockUnblockReason;

    @Override
    public String toXmlString() {
        return super.convertObjectToXmlString(this, this.getClass());
    }

    @Override
    public void generateSessionID(HelperFacade helperFacade) {
        setSessionID(helperFacade.generateSessionID(this.getDestinationInstitutionCode()));
    }
}

Этот один POJO выше будет обслуживать несколько операций, но с разными Root Именами Элементов для каждого например,

<AmountUnblockRequest>
<SessionID>000001100913103301000000000001</SessionID>
<DestinationInstitutionCode>000002</DestinationInstitutionCode>
<ChannelCode>7</ChannelCode>
<ReferenceCode>xxxxxxxxxxxxxxx</ReferenceCode>
<TargetAccountName>Ajibade Oluwasegun</TargetAccountName>
<TargetBankVerificationNumber>1033000442</TargetBankVerificationNumber>
<TargetAccountNumber>2222002345</TargetAccountNumber>
<ReasonCode>0001</ReasonCode>
<Narration>Transfer from 000002 to 0YY</Narration>
<Amount>1000.00</Amount>
</AmountUnblockRequest>

и

<AmountBlockRequest>
<SessionID>000001100913103301000000000001</SessionID>
<DestinationInstitutionCode>000002</DestinationInstitutionCode>
<ChannelCode>7</ChannelCode>
<ReferenceCode>xxxxxxxxxxxxxxx</ReferenceCode>
<TargetAccountName>Ajibade Oluwasegun</TargetAccountName>
<TargetBankVerificationNumber>1033000442</TargetBankVerificationNumber>
<TargetAccountNumber>2222002345</TargetAccountNumber>
<ReasonCode>0001</ReasonCode>
<Narration>Transfer from 000002 to 0YY</Narration>
<Amount>1000.00</Amount>
</AmountBlockRequest>

Я хочу избежать боли, связанной с созданием двух идентичных классов, потому что имя элемента root изменится.

1 Ответ

0 голосов
/ 02 апреля 2020

Вы можете использовать Декларативное потоковое сопоставление (DSM) Библиотека анализа потока. Вам не нужно аннотировать ваш POJO как для XML, так и для JSON.

Вы просто определяете отображение для данных, которые вы хотите извлечь из XML.

Вот отображение определения для вашего XML.

result:
  path: /(AmountBlockRequest|AmountUnblockRequest) // path is regex
  type: object
  fields:
    TargetBankVerificationNumber:
    Narration:
    amount:
      path: amount
      xml:
        path: Amount
    targetAccountNumber:
      path: targetAccountNumber
      xml:
        path: TargetAccountNumber

    channelCode:
      path: ChannelCode
    referenceCode:
      path: ReferenceCode
    destinationInstitutionCode:
      path: DestinationInstitutionCode
    targetAccountName:
      path: TargetAccountName
    sessionID:
      path: SessionID
    reasonCode:
      path: ReasonCode
    blockUnblockReason:
      path: BlockUnblockReason

Java Код для анализа XML:

DSM dsm=new DSMBuilder(new File("path/to/mapping.yaml")).setType(DSMBuilder.TYPE.XML)..create(AmountOrAccountBlockOrUnblockRequest.class);;
// For json
//DSM dsm=new DSMBuilder(new File("path/to/mapping.yaml")).setType(DSMBuilder.TYPE.JSON)..create(AmountOrAccountBlockOrUnblockRequest.class);
AmountOrAccountBlockOrUnblockRequest result=  (AmountOrAccountBlockOrUnblockRequest)dsm.toObject(xmlFileContent);
// json represntation fo result
dsm.getObjectMapper().writerWithDefaultPrettyPrinter().writeValue(System.out, object);

Вывод:

   {
  "amount" : "1000.00",
  "targetAccountNumber" : "2222002345",
  "blockUnblock" : false,
  "blockUnblockReason" : null,
  "sessionID" : "000001100913103301000000000001",
  "reasonCode" : "0001",
  "referenceCode" : "xxxxxxxxxxxxxxx",
  "channelCode" : "7",
  "narration" : null,
  "targetBankVerificationNumber" : null,
  "destinationInstitutionCode" : "000002",
  "targetAccountName" : "Ajibade Oluwasegun"
}

В настоящее время сериализация не поддерживается.

...