首页 > 解决方案 > 一个 POJO,但 XmlRootElement 名称不同

问题描述

例如,我有一个 POJO,如下所示,但它提供给多个操作,但我不想创建几个相同的 POJO,因为每个操作的根元素名称都会更改。因此我需要一个 POJO,但我可以动态更改根元素名称。

@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 将服务于多个操作,但每个操作具有不同的根元素名称,例如,

<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>

我想避免必须创建两个相同的类的痛苦,因为根元素名称会改变。

标签: javaxmlpojoxmlroot

解决方案


您可以使用声明式流映射 (DSM)流解析库。您不需要为 XML 和 JSON 注释 POJO。

您只需定义要从 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

解析 XML 的 Java 代码:

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"
}

目前不支持序列化。


推荐阅读