Благодарю. Стиль именования был вдохновлен Робертом Мартином «Чистый код: руководство по гибкому программному обеспечению».
я есть заданный набор классов, чтобы разобрать XML в дерево объектов. Теперь я получил расширенный XML и хочу заменить один класс в дереве объектов на расширенную версию.
XML-файл
<?xml version="1.0" encoding="UTF-8"?>
<RootNode_001>
<systemId>on the 4</systemId>
<systemName>give me some more</systemName>
<person>
<firstname>James</firstname>
<lastname>Brown</lastname>
<address>
<street>Funky</street>
<city>Town</city>
<type>HOME</type> <!-- this is the new field -->
</address>
</person>
</RootNode_001>
Я создаю новый класс адресов с новым полем, как это:
public class ExtAddress extends Address {
// inherit from address and add new field
private String type;
public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
}
Теперь я пытаюсь разобраться в дереве объектов и ожидаюExtAddress
быть частью дерева вот так:
public class Runner {
public static void main ( String argv[] ) throws Exception {
File file = new File( "basic.xml" );
Class cls = RootNode.class;
// create a context with the root node and the replacement class
JAXBContext jaxbContext = JAXBContext.newInstance( ExtAddress.class, cls );
Unmarshaller unmarshaller = jaxbContext.createUnmarshaller();
JAXBElement jaxbElement = unmarshaller.unmarshal( new StreamSource( file ), cls );
RootNode rootNode = (RootNode) jaxbElement.getValue();
System.out.println( rootNode.getClass().getName() );
System.out.println( rootNode.getPerson().getClass().getName() );
// this returns Address but I want ExtAddress
System.out.println( rootNode.getPerson().getAddress().getClass().getName() );
}
}
Пока я не использую аннотации. Возвращение не маршалированного объектаAddress
и нетExtAddress
, Если я добавлюXmlType
В аннотации я получаю исключение:
@XmlTyp( name = "address" )
ExtAddress extends Address {
...
}
Exception in thread "main" com.sun.xml.internal.bind.v2.runtime.IllegalAnnotationsException: 1 counts of IllegalAnnotationExceptions
Two classes have the same XML type name "address". Use @XmlType.name and @XmlType.namespace to assign different names to them.
this problem is related to the following location:
at jaxb.standard.Address
at jaxb.ExtAddress
Я пробовал много вещей, но это, кажется, очень близко к решению. Как я могу сказать jaxb использовать унаследованный класс вместо исходного.
Я хочу получить набор стандартных классов в библиотеке и иметь возможность изменить дерево объектов позже как расширение при появлении новых полей в xml.