Индивидуальный вывод JAXB xml - PullRequest
1 голос
/ 16 июня 2011

Учитывая следующий класс:

public class Customer {
  public String name;
  public String lastName;
}

Я хочу сгенерировать следующий вывод XML, используя JAXB для клиента, чей name - Джон, а lastName - Доу:

<cst>John Doe</cst>

Как я могу сделать это с JAXB?

РЕДАКТИРОВАТЬ

Класс Customer используется в нескольких местах, как показано здесь:

public class Sale {
  private String productId;
  private Date date;
  private Customer customer;
}

public class Transaction {
  private List<Sale> sales;
}

... и так далее ... Дело в том, как я могу сказать JAXB: «всякий раз, когда вы видите клиента, пожалуйста, используйте пользовательское форматирование»?

Моя проблема в том, что существует много классов, содержащих клиента, и я хочу программно контролировать вывод (иногда name + lastname, иногда <name>name</name>, <lastname>lastname</lastname>), не добавляя аннотации для каждого класса, который содержитCustomer.Это требование исключает использование JAXBElement<Customer>.

1 Ответ

2 голосов
/ 16 июня 2011

Вы можете установить XmlAdapter, который обрабатывает перевод:

public static void main(String[] args) throws Exception {

    JAXBContext ctxt = JAXBContext.newInstance(CustomerWrapper.class);
    Marshaller m = ctxt.createMarshaller();
    m.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE);

    Customer customer = new Customer("John", "Doe");
    m.marshal(new JAXBElement<CustomerWrapper>(new QName("cwrapper"), CustomerWrapper.class, new CustomerWrapper(customer)), System.err);

}

static class CustomerWrapper {
    private Customer customer;

    public CustomerWrapper() {
    }

    public CustomerWrapper(Customer customer) {
        this.customer = customer;
    }

    public Customer getCustomer() {
        return customer;
    }

    public void setCustomer(Customer customer) {
        this.customer = customer;
    }
}

@XmlJavaTypeAdapter(CustomerAdapter.class)
static class Customer {
    private String name;
    private String lastName;
    public Customer() {
    }
    public Customer(String name, String lastName) {
        this.name = name;
        this.lastName = lastName;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getLastName() {
        return lastName;
    }
    public void setLastName(String lastName) {
        this.lastName = lastName;
    }
}

static class CustomerAdapter extends XmlAdapter<String, Customer> {

    @Override
    public Customer unmarshal(String v) throws Exception {
        String[] ss = v.split(" ");
        return new Customer(ss[0], ss[1]);
    }

    @Override
    public String marshal(Customer v) throws Exception {
        return v.getName() + " " + v.getLastName();
    }

}

output

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<cwrapper>
    <customer>John Doe</customer>
</cwrapper>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...