2009-07-27 12 views
7

У меня есть xsd, сгенерированный из набора существующих классов Java, и в настоящее время он успешно отменяет XML-сообщения в объекте, как и ожидалось, однако то, что я хотел бы сделать, это то, где у меня есть существующий экземпляр объекта есть unmarshaller просто обновить поля, которые содержатся в сообщении переданного емуUnmarshalling XML для существующего объекта с использованием JAXB

, например (прощают ошибки синтаксиса вот его непосредственной близости от верхней части моей головы)

Если бы я имел аннотированная книга класса с многочисленными полями, заголовком, автором, опубликованным и т. д. и соответствующим сгенерированным xsd, а также из полей, которые не обязательны. Я хотел бы иметь возможность, если бы получил следующий x мл

<Book> 
<title>Dummys guide to JAXB</title> 
</Book> 

, а не просто создать новый экземпляр книги с только название набора применить это в существующий экземпляр как обновление, так просто установив переменную заголовка на этом экземпляре.

+0

о да, и я использую JAXB в момент маршализацию в XML – robinsad

ответ

5

JAXB не может этого сделать для вас, нет. Однако, что вы можете сделать, это использовать JAXB для демонтажа вашего XML-документа на новый объект, а затем заново отразить свойства нового объекта на вашем существующем.

Commons BeanUtils обеспечивает механизм для этого, например, метод BeanUtils.copyProperties. Однако я не уверен, что это делает глубокие копии.

0

Вы делаете эту работу с JAXB, но вам нужно выполнить большую часть работы самостоятельно.

В вашем примере вам нужна возможность поиска, например, одноэлементный реестр названий для резервирования объектов.

Поскольку ваш идентификатор, заголовок, является дочерним элементом, нет гарантии, что JAXB посетит элемент заголовка перед любым другим элементом. Самый простой способ - просто скопировать свойства из экземпляра книги, созданного Unmarshaller, в экземпляр экземпляра singleton. afterUnmarsal обратного вызова место, чтобы сделать это:

class Book { 
// ... 
private void afterUnmarshal(Unmarshaller reader, Object parent) { 
    Book singleton = BookRegistry.getInstance().getBook(this.title); 
    if (this.publisher != null) singleton.setPublisher(this.publisher); 
    if (this.author != null) singleton.setPublisher(this.publisher); 
    // ... 
} 
} 

Если вы хотите зарегистрировать объекты из документа XML на лету, это немного сложнее. В вашем случае вы, вероятно, хотите что-то вроде:

class Book { 
// ... 
public void setTitle(String title) { 
    this.title = title; 
    Book singleton = BookRegistry.getInstance().getBook(this.title); 
    if (singleton == null) BookRegistry.getInstance().addBook(this.title, this); 
} 
} 

который будет работать до тех пор, пока у вас нет вложенных книг.