Если у вас есть контейнеры, ломающие строки, после нескольких часов поиска хорошего решения CSS и не находящие ни одного, я теперь использую вместо этого jQuery:
$('button').click(function(){
$('nav ul').each(function(){
$parent = $(this).parent();
$parent.width( $(this).width() );
});
});
nav {
display: inline-block;
text-align: left; /* doesn't do anything, unlike some might guess */
}
ul {
display: inline;
}
/* needed style */
ul {
padding: 0;
}
body {
width: 420px;
}
/* just style */
body {
background: #ddd;
margin: 1em auto;
}
button {
display: block;
}
nav {
background: #bbb;
margin: 1rem auto;
padding: 0.5rem;
}
li {
display: inline-block;
width: 40px;
height: 20px;
border: solid thin #777;
margin: 4px;
background: #999;
text-align: center;
}
JAXB не может сделать это за вас, нет. Однако вы могли бы использовать JAXB для демаршалинга вашего XML-документа на новый объект, а затем рефлексивно скопировать свойства нового объекта на существующий.
Commons BeanUtils предоставляет механизм для этого, такие как метод BeanUtils.copyProperties
. Я не уверен, что это делает глубокие копии.
Вы выполняете эту работу с помощью JAXB, но вы должны делать большую часть работы самостоятельно.
В вашем примере вам нужна возможность поиска, такая как одноэлементный реестр заголовков для объектов книги .
Поскольку ваш идентификатор, title, является дочерним элементом, нет гарантии, что JAXB посетит этот элемент заголовка раньше любого другого элемента. Самый простой способ обойти это - просто скопировать свойства из экземпляра Book, созданного Unmarshaller, в ваш одноэлементный экземпляр Book. Обратный вызов 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);
}
}
, которое будет работать, пока у вас нет вложенных Книг.
Вы можете достичь этого, используя плагин Copyable из JAXB2 Commons - Copyable+plugin