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

我想避免因为根元素名称将更改而不得不创建两个相同类的痛苦。

您可以使用声明流映射(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"
}

目前它不支持序列化。

最新更新