java - 一个 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"
}
目前不支持序列化。
推荐阅读
- spring - 在 Spring Boot 中使用 OAuth2 保护 Spring REST 服务的问题
- html - mapbox studio 图层高亮城市公式
- html - Font-Awesome FA 图标未出现在托管的 github 页面上,但适用于本地
- php - HREF 链接不可点击
- arrays - 无法从 JSON 格式检索值
- google-sheets - google sheet - 如何将多个迷你表组合成一张表
- ios - 我在 SwiftUI 中有一个项目,我想实现情节提要
- r - 网络树状图级别不累加
- python - 使用 PIL 从数组中绘制图像
- docker - 为什么 kubernetes minikube 会限制全局 CPU 使用率?