将xml解析为java对象时没有单个字符串构造函数/工厂方法错误
我试图将xml响应转换为java对象,但在解析时出错。我尝试了所有的选择,但没有成功。xml可以有多个标记。 将xml标记转换为数组对象时基本上会出现错误。 我的课程是:将xml解析为java对象时没有单个字符串构造函数/工厂方法错误,java,json,xml,jackson,fasterxml,Java,Json,Xml,Jackson,Fasterxml,我试图将xml响应转换为java对象,但在解析时出错。我尝试了所有的选择,但没有成功。xml可以有多个标记。 将xml标记转换为数组对象时基本上会出现错误。 我的课程是: public static AHBESBFetchAllAccountsFullResponse parseXMLResponseForGetAllAccounts(byte[] response) throws JsonParseException, JsonMappingException, IOE
public static AHBESBFetchAllAccountsFullResponse parseXMLResponseForGetAllAccounts(byte[] response)
throws JsonParseException, JsonMappingException, IOException {
ObjectMapper objectMapper;
AHBESBFetchAllAccountsFullResponse getAllAccountsResponse = null;
System.err.println(response);
objectMapper = new XmlMapper();
getAllAccountsResponse = objectMapper.readValue(StringUtils.toEncodedString(response, StandardCharsets.UTF_8),
AHBESBFetchAllAccountsFullResponse.class);
System.err.println(getAllAccountsResponse.getResponseBody().getCustomerAccountsReply().getCustomerNumber());
return getAllAccountsResponse;
}
帐目摘要答覆:
public class AccountSummaryReply {
@JacksonXmlProperty(localName = "AccountSubType")
private String AccountSubType;
@JacksonXmlProperty(localName = "WorkingBalance")
private String WorkingBalance;
@JacksonXmlProperty(localName = "AccountStatus")
private String AccountStatus;
@JacksonXmlProperty(localName = "AccountNumber")
private String AccountNumber;
@JacksonXmlProperty(localName = "BranchCode")
private String BranchCode;
@JacksonXmlProperty(localName = "AccountName")
private String AccountName;
@JacksonXmlProperty(localName = "OpenActualBalance")
private String OpenActualBalance;
@JacksonXmlProperty(localName = "Currency")
private String Currency;
@JacksonXmlProperty(localName = "IBAN")
private String IBAN;
@JacksonXmlProperty(localName = "AccountType")
private String AccountType;
public String getAccountSubType ()
{
return AccountSubType;
}
public void setAccountSubType (String AccountSubType)
{
this.AccountSubType = AccountSubType;
}
public String getWorkingBalance ()
{
return WorkingBalance;
}
public void setWorkingBalance (String WorkingBalance)
{
this.WorkingBalance = WorkingBalance;
}
public String getAccountStatus ()
{
return AccountStatus;
}
public void setAccountStatus (String AccountStatus)
{
this.AccountStatus = AccountStatus;
}
public String getAccountNumber ()
{
return AccountNumber;
}
public void setAccountNumber (String AccountNumber)
{
this.AccountNumber = AccountNumber;
}
public String getBranchCode ()
{
return BranchCode;
}
public void setBranchCode (String BranchCode)
{
this.BranchCode = BranchCode;
}
public String getAccountName ()
{
return AccountName;
}
public void setAccountName (String AccountName)
{
this.AccountName = AccountName;
}
public String getOpenActualBalance ()
{
return OpenActualBalance;
}
public void setOpenActualBalance (String OpenActualBalance)
{
this.OpenActualBalance = OpenActualBalance;
}
public String getCurrency ()
{
return Currency;
}
public void setCurrency (String Currency)
{
this.Currency = Currency;
}
public String getIBAN ()
{
return IBAN;
}
public void setIBAN (String IBAN)
{
this.IBAN = IBAN;
}
public String getAccountType ()
{
return AccountType;
}
public void setAccountType (String AccountType)
{
this.AccountType = AccountType;
}
@Override
public String toString()
{
return "AccountSummaryReply [AccountSubType = "+AccountSubType+", WorkingBalance = "+WorkingBalance+", AccountStatus = "+AccountStatus+", AccountNumber = "+AccountNumber+", BranchCode = "+BranchCode+", AccountName = "+AccountName+", OpenActualBalance = "+OpenActualBalance+", Currency = "+Currency+", IBAN = "+IBAN+", AccountType = "+AccountType+"]";
}}
操作会计报告:
public class OperativeAccountsReply {
@JacksonXmlProperty(localName = "AccountSummaryReply")
private AccountSummaryReply[] AccountSummaryReply;
public AccountSummaryReply[] getAccountSummaryReply ()
{
return AccountSummaryReply;
}
public void setAccountSummaryReply (AccountSummaryReply[] AccountSummaryReply)
{
this.AccountSummaryReply = AccountSummaryReply;
}
@Override
public String toString()
{
return "OperativeAccountsReply [AccountSummaryReply = "+AccountSummaryReply+"]";
}
}
public class CustomerAccountsReply {
@JacksonXmlProperty(localName = "FinanceAccountsReply")
private FinanceAccountsReply FinanceAccountsReply;
@JacksonXmlProperty(localName = "CustomerNumber")
private String CustomerNumber;
@JacksonXmlProperty(localName = "InvestmentAccountsReply")
private InvestmentAccountsReply InvestmentAccountsReply;
@JacksonXmlProperty(localName = "ReturnCode")
private String ReturnCode;
@JacksonXmlProperty(localName = "OperativeAccountsReply")
private OperativeAccountsReply OperativeAccountsReply;
@JacksonXmlProperty(localName = "ReferenceNum")
private String ReferenceNum;
@JacksonXmlProperty(localName = "ReturnText")
private String ReturnText;
public FinanceAccountsReply getFinanceAccountsReply ()
{
return FinanceAccountsReply;
}
public void setFinanceAccountsReply (FinanceAccountsReply FinanceAccountsReply)
{
this.FinanceAccountsReply = FinanceAccountsReply;
}
public String getCustomerNumber ()
{
return CustomerNumber;
}
public void setCustomerNumber (String CustomerNumber)
{
this.CustomerNumber = CustomerNumber;
}
public InvestmentAccountsReply getInvestmentAccountsReply ()
{
return InvestmentAccountsReply;
}
public void setInvestmentAccountsReply (InvestmentAccountsReply InvestmentAccountsReply)
{
this.InvestmentAccountsReply = InvestmentAccountsReply;
}
public String getReturnCode ()
{
return ReturnCode;
}
public void setReturnCode (String ReturnCode)
{
this.ReturnCode = ReturnCode;
}
public OperativeAccountsReply getOperativeAccountsReply ()
{
return OperativeAccountsReply;
}
public void setOperativeAccountsReply (OperativeAccountsReply OperativeAccountsReply)
{
this.OperativeAccountsReply = OperativeAccountsReply;
}
public String getReferenceNum ()
{
return ReferenceNum;
}
public void setReferenceNum (String ReferenceNum)
{
this.ReferenceNum = ReferenceNum;
}
public String getReturnText ()
{
return ReturnText;
}
public void setReturnText (String ReturnText)
{
this.ReturnText = ReturnText;
}
@Override
public String toString()
{
return "CustomerAccountsReply [FinanceAccountsReply = "+FinanceAccountsReply+", CustomerNumber = "+CustomerNumber+", InvestmentAccountsReply = "+InvestmentAccountsReply+", ReturnCode = "+ReturnCode+", OperativeAccountsReply = "+OperativeAccountsReply+", ReferenceNum = "+ReferenceNum+", ReturnText = "+ReturnText+"]";
}
}
客户帐户报告:
public class OperativeAccountsReply {
@JacksonXmlProperty(localName = "AccountSummaryReply")
private AccountSummaryReply[] AccountSummaryReply;
public AccountSummaryReply[] getAccountSummaryReply ()
{
return AccountSummaryReply;
}
public void setAccountSummaryReply (AccountSummaryReply[] AccountSummaryReply)
{
this.AccountSummaryReply = AccountSummaryReply;
}
@Override
public String toString()
{
return "OperativeAccountsReply [AccountSummaryReply = "+AccountSummaryReply+"]";
}
}
public class CustomerAccountsReply {
@JacksonXmlProperty(localName = "FinanceAccountsReply")
private FinanceAccountsReply FinanceAccountsReply;
@JacksonXmlProperty(localName = "CustomerNumber")
private String CustomerNumber;
@JacksonXmlProperty(localName = "InvestmentAccountsReply")
private InvestmentAccountsReply InvestmentAccountsReply;
@JacksonXmlProperty(localName = "ReturnCode")
private String ReturnCode;
@JacksonXmlProperty(localName = "OperativeAccountsReply")
private OperativeAccountsReply OperativeAccountsReply;
@JacksonXmlProperty(localName = "ReferenceNum")
private String ReferenceNum;
@JacksonXmlProperty(localName = "ReturnText")
private String ReturnText;
public FinanceAccountsReply getFinanceAccountsReply ()
{
return FinanceAccountsReply;
}
public void setFinanceAccountsReply (FinanceAccountsReply FinanceAccountsReply)
{
this.FinanceAccountsReply = FinanceAccountsReply;
}
public String getCustomerNumber ()
{
return CustomerNumber;
}
public void setCustomerNumber (String CustomerNumber)
{
this.CustomerNumber = CustomerNumber;
}
public InvestmentAccountsReply getInvestmentAccountsReply ()
{
return InvestmentAccountsReply;
}
public void setInvestmentAccountsReply (InvestmentAccountsReply InvestmentAccountsReply)
{
this.InvestmentAccountsReply = InvestmentAccountsReply;
}
public String getReturnCode ()
{
return ReturnCode;
}
public void setReturnCode (String ReturnCode)
{
this.ReturnCode = ReturnCode;
}
public OperativeAccountsReply getOperativeAccountsReply ()
{
return OperativeAccountsReply;
}
public void setOperativeAccountsReply (OperativeAccountsReply OperativeAccountsReply)
{
this.OperativeAccountsReply = OperativeAccountsReply;
}
public String getReferenceNum ()
{
return ReferenceNum;
}
public void setReferenceNum (String ReferenceNum)
{
this.ReferenceNum = ReferenceNum;
}
public String getReturnText ()
{
return ReturnText;
}
public void setReturnText (String ReturnText)
{
this.ReturnText = ReturnText;
}
@Override
public String toString()
{
return "CustomerAccountsReply [FinanceAccountsReply = "+FinanceAccountsReply+", CustomerNumber = "+CustomerNumber+", InvestmentAccountsReply = "+InvestmentAccountsReply+", ReturnCode = "+ReturnCode+", OperativeAccountsReply = "+OperativeAccountsReply+", ReferenceNum = "+ReferenceNum+", ReturnText = "+ReturnText+"]";
}
}
将xml解析为类的代码如下:
public static AHBESBFetchAllAccountsFullResponse parseXMLResponseForGetAllAccounts(byte[] response)
throws JsonParseException, JsonMappingException, IOException {
ObjectMapper objectMapper;
AHBESBFetchAllAccountsFullResponse getAllAccountsResponse = null;
System.err.println(response);
objectMapper = new XmlMapper();
getAllAccountsResponse = objectMapper.readValue(StringUtils.toEncodedString(response, StandardCharsets.UTF_8),
AHBESBFetchAllAccountsFullResponse.class);
System.err.println(getAllAccountsResponse.getResponseBody().getCustomerAccountsReply().getCustomerNumber());
return getAllAccountsResponse;
}
响应xml为:
<HB_EAI_REPLY>
<HB_EAI_HEADER>
<MsgFormat> FULL.ACCOUNT.INQUIRY </MsgFormat>
<MsgVersion>0000</MsgVersion>
<RequestorId>HB</RequestorId>
<RequestorChannelId>IB</RequestorChannelId>
<RequestorUserId/>
<RequestorLanguage>E</RequestorLanguage>
<RequestorSecurityInfo/>
<EaiReference>0</EaiReference>
<ReturnCode>0000</ReturnCode>
</HB_EAI_HEADER>
<Reply>
<CustomerAccountsReply>
<ReferenceNum>20100407183503799</ReferenceNum>
<CustomerNumber>1234567</CustomerNumber>
<ReturnText>OK</ReturnText>
<OperativeAccountsReply>
<AccountSummaryReply >
<AccountNumber>545545453</AccountNumber>
<IBAN>AE12345678901234567890123456789012</IBAN>
<AccountType> </AccountType>
<AccountSubType />
<AccountStatus>SA</AccountStatus>
<BranchCode>AE0010004</BranchCode>
<AccountName> Mohammad </AccountName>
<Currency >011</Currency >
<OpenActualBalance/>
<WorkingBalance > </WorkingBalance >
</AccountSummaryReply>
<AccountSummaryReply>
<AccountNumber>545545453</AccountNumber>
<IBAN>AE12345678901234567890123456789012</IBAN>
<AccountType>Mohammad</AccountType >
<AccountSubType />
<AccountStatus>SA</AccountStatus >
<BranchCode>AE0010004</BranchCode>
<AccountName/>
<Currency>011</Currency >
<OpenActualBalance>00</OpenActualBalance >
<WorkingBalance>AED</WorkingBalance >
</AccountSummaryReply>
</OperativeAccountsReply>
<InvestmentAccountsReply>
<InvestmentContract>
<InvestmentContractNo>0903123243</InvestmentContractNo>
<InvestmentHolderName>This is the holder’s Name</InvestmentHolderName>
<InvestmentAccountType>One Year Term Deposit</InvestmentAccountType>
<InvestmentBranchCode>AE0010004</InvestmentBranchCode>
<InvestmentCurrencyCode>AED</InvestmentCurrencyCode>
<InvestmentAmount>100000</InvestmentAmount>
<InvestmentOpenDate>20090207</InvestmentOpenDate>
<MaturityDate>20100207</MaturityDate>
<DepositTenor>12</DepositTenor>
<CategoryID>21016</CategoryID>
</InvestmentContract>
<InvestmentContract>
<InvestmentContractNo>0903123243</InvestmentContractNo>
<InvestmentHolderName>This is the holder’s Name</InvestmentHolderName>
<InvestmentAccountType>One Year Term Deposit</InvestmentAccountType>
<InvestmentBranchCode>AE0010004</InvestmentBranchCode>
<InvestmentCurrencyCode>AED</InvestmentCurrencyCode>
<InvestmentAmount>100000</InvestmentAmount>
<InvestmentOpenDate>20090207</InvestmentOpenDate>
<MaturityDate>20100207</MaturityDate>
<DepositTenor>12</DepositTenor>
<CategoryID>21016</CategoryID>
</InvestmentContract>
</InvestmentAccountsReply>
<FinanceAccountsReply>
<FinanceContract>
<LoanContractNumber>LD0831601635</LoanContractNumber>
<FinanceHolderName>This is the name of Finance Holder</FinanceHolderName>
<FinanceBranchCode>AE0010004</FinanceBranchCode>
<FinanceCurrencyCode>AED</FinanceCurrencyCode>
<FinanceOpenDate>20081106</FinanceOpenDate>
<InstallmentAmount>11974</InstallmentAmount>
<OutstandingDueAmount>1939858.9</OutstandingDueAmount>
<InitialLoanAmount>1127100</InitialLoanAmount>
<DueDate>20100701</DueDate>
<RemainingNoOfInstallments>162</RemainingNoOfInstallments>
<InitialNoOfInstallments>180</InitialNoOfInstallments>
<LoanType>Retail Tawaruq</LoanType>
<NumOfDaysPastDuedate>32</NumOfDaysPastDuedate>
</FinanceContract>
<FinanceContract>
<LoanContractNumber>LD0909004393</LoanContractNumber>
<FinanceHolderName>This is the name of Finance Holder</FinanceHolderName>
<FinanceBranchCode>AE0010004</FinanceBranchCode>
<FinanceCurrencyCode>AED</FinanceCurrencyCode>
<FinanceOpenDate>20090329</FinanceOpenDate>
<InstallmentAmount>-301732.95</InstallmentAmount>
<OutstandingDueAmount>1360190.99</OutstandingDueAmount>
<InitialLoanAmount>2025000</InitialLoanAmount>
<DueDate>20100930</DueDate>
<RemainingNoOfInstallments>2</RemainingNoOfInstallments>
<InitialNoOfInstallments>3</InitialNoOfInstallments>
<LoanType>Leasehold - Regular Forward Ijara</LoanType>
<NumOfDaysPastDuedate>32</NumOfDaysPastDuedate>
</FinanceContract>
</FinanceAccountsReply>
<ReturnCode>0000</ReturnCode>
</CustomerAccountsReply>
</Reply>
</HB_EAI_REPLY>
AccountSummaryReply数组似乎已在XML中展开。它通常看起来像:
<AccountSummaryReplies>
<AccountSummaryReply>
<AccountNumber>545545453</AccountNumber>
</AccountSummaryReply>
<AccountSummaryReply>
<AccountNumber>545545454</AccountNumber>
</AccountSummaryReply>
</AccountSummaryReplies>
作为一个旁注,请考虑用X/MP>配置XMLMAPER。
这意味着XML中的所有属性名称都以大写字母开头,并允许跳过所有@JacksonXmlPropertylocalName=注释