Есть 2 класса, в которых я описал теги.
import javax.xml.bind.annotation.*;
@XmlRootElement(name = "request")
@XmlAccessorType(XmlAccessType.FIELD)
public class AuthorizeRequest extends RequestHeader {
private To to;
private Receipt receipt;
public AuthorizeRequest() {
}
public static class To {
public To() {
}
@XmlElement(name = "account-number")
private String accountNumber;
@XmlElement(name = "amount")
private Double amount;
public To(String accountNumber, Double amount) {
this.accountNumber = accountNumber;
this.amount = amount;
}
@Override
public String toString() {
return "To{" + "accountNumber=" + accountNumber + ", amount=" + amount + '}';
}
}
public static class Receipt {
public Receipt() {
}
@XmlElement(name = "datetime")
private String datetime;
@XmlElement(name = "receipt-number")
private String receiptNumber;
public Receipt(String datetime, String receiptNumber) {
this.datetime = datetime;
this.receiptNumber = receiptNumber;
}
@Override
public String toString() {
return "Receipt{" + "datetime=" + datetime + ", receiptNumber=" + receiptNumber + '}';
}
}
public void setAdditionalData(String accountNumber, Double amount, String datetime, String receiptNumber) {
this.to = new To(accountNumber, amount);
this.receipt = new Receipt(datetime, receiptNumber);
}
@Override
public String toString() {
return "AuthorizeRequest{" + "to=" + to + ", receipt=" + receipt + '}';
}
}
и второй класс:
import javax.xml.bind.annotation.*;
/**
* Created by urmat.ukeshov on 30.06.2017.
*/
@XmlAccessorType(XmlAccessType.FIELD)
public class RequestHeader {
@XmlElement(name = "request-type")
private String requestType;
@XmlElementRef(name = "extra")
private Login login = new Login();
@XmlElementRef(name = "extra")
private Password password = new Password();
@XmlAccessorType(XmlAccessType.FIELD)
@XmlRootElement(name = "extra")
public static class Login {
@XmlAttribute(name = "name")
private String login = "login";
@XmlValue
private String loginValue;
public String getLogin() {
return login;
}
public void setLogin(String login) {
this.login = login;
}
public String getLoginValue() {
return loginValue;
}
public void setLoginValue(String loginValue) {
this.loginValue = loginValue;
}
@Override
public String toString() {
return "Login{" + "login=" + login + ", loginValue=" + loginValue + '}';
}
}
@XmlAccessorType(XmlAccessType.FIELD)
@XmlRootElement(name = "extra")
public static class Password {
@XmlAttribute(name = "name")
private String password = "password-md5";
@XmlValue
private String passwordValue;
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getPasswordValue() {
return passwordValue;
}
public void setPasswordValue(String passwordValue) {
this.passwordValue = passwordValue;
}
@Override
public String toString() {
return "Password{" + "password=" + password + ", passwordValue=" + passwordValue + '}';
}
}
@XmlElement(name = "transaction-number")
private String transactionNumber;
public String getRequestType() {
return requestType;
}
public void setRequestType(String requestType) {
this.requestType = requestType;
}
public String getTransactionNumber() {
return transactionNumber;
}
public void setTransactionNumber(String transactionNumber) {
this.transactionNumber = transactionNumber;
}
public Login getLogin() {
return login;
}
public void setLogin(Login login) {
this.login = login;
}
public Password getPassword() {
return password;
}
public void setPassword(Password password) {
this.password = password;
}
public void setLoginPassword(String login, String password) {
this.login.setLoginValue(login);
this.password.setPasswordValue(password);
}
@Override
public String toString() {
return "RequestHeader{" + "requestType=" + requestType + ", login=" + login + ", password=" + password + ", transactionNumber=" + transactionNumber + '}';
}
}
и класс обработчик:
import model.AuthorizeRequest;
import javax.xml.bind.*;
import java.io.StringReader;
public class Main {
public static void main(String[] args) throws JAXBException {
String xml = "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n" +
"<request>\n" +
"\t<request-type>1</request-type>\n" +
"\t<extra name=\"login\">login</extra>\n" +
"\t<extra name=\"password-md5\">password</extra>\n" +
"\t<transaction-number>5435345345345</transaction-number>\n" +
"\t<to>\n" +
"\t\t<account-number>543543534534</account-number>\n" +
"\t\t<amount>12.0</amount>\n" +
"\t</to>\n" +
"\t<receipt>\n" +
"\t\t<datetime>1201564878451420</datetime>\n" +
"\t\t<receipt-number>5435345345345435</receipt-number>\n" +
"\t</receipt>\n" +
"</request>";
try {
StringReader reader = new StringReader(xml);
JAXBContext jAXBContext = JAXBContext.newInstance(AuthorizeRequest.class);
Unmarshaller unmarshaller = jAXBContext.createUnmarshaller();
AuthorizeRequest authorizeRequest = (AuthorizeRequest) unmarshaller.unmarshal(reader);
} catch (JAXBException ex) {
ex.printStackTrace();
}
}
}
Проблема заключается в том, что когда я произвожу unmarshal
, получаю null
значения из внутреннего класса Password
, а его значения записываются в переменные класса Login
.
Просьба помочь - как правильно парсить через JAXB
атрибуты xml
?
Свежие комментарии