Я задаюсь вопросом, возможно ли иметь JAXB для не создания объекта Java для элементов XML, которые служат обертками. Например, для XML следующей структуры
<root>
<wrapper>
<entity/>
</wrapper>
</root>
Я не хочу объект для <wrapper>
быть созданным вообще. Таким образом для класса как
class Root {
private Entity entity;
}
<entity>
элемент должен быть не упорядочен непосредственно в поле объекта.
Действительно ли возможно достигнуть с JAXB?
Несмотря на то, что для этого требуется дополнительное кодирование, желаемое немаршалинг выполняется следующим образом с использованием объекта временной оболочки:
@XmlRootElement(name = "root")
public class Root {
private Entity entity;
static class Entity {
}
static class EntityWrapper {
@XmlElement(name = "entity")
private Entity entity;
public Entity getEntity() {
return entity;
}
}
@XmlElement(name = "wrapper")
private void setEntity(EntityWrapper entityWrapper) {
entity = entityWrapper.getEntity();
}
}
Вся суть JAXB или других систем отображения заключается в отображении элементов и их иерархии на классы. В вашем примере вы, кажется, хотите, чтобы JAXB каким-то образом знал, что он может маршалировать сущность в оболочку / сущность и наоборот, фактически не создавая класс, используемый для сопоставления оболочки и связи между корнем и сущностью. Что, в представленном виде, примерно эквивалентно вопросу о том, как подключить двигатель автомобиля к колесам без карданного вала.
Итак, если я не упущу суть, ответ будет отрицательным - ни JAXB, ни какая-либо другая программа отображения не может этого сделать. Вы можете избежать создания классов, используя что-то, что отображает чисто динамическое отображение (см. Groovy, GPath для примера), но это позволяет избежать создания всех классов, а не просто пропустить один промежуточный уровень в иерархии.
EclipseLink MOXy предлагает реализацию JAXB 2.2 с расширениями. Одна из расширенных возможностей - использовать XPath для навигации по слоям XML, которые вам не нужны в вашей модели предметной области.
Если вы посмотрите на:
http://wiki.eclipse.org/EclipseLink/Examples/MOXy/GettingStarted/MOXyExtensions
, вы заметите, что имя клиента хранится внутри, но это имя является строкой атрибут Заказчика. Это достигается с помощью:
@XmlPath("personal-info/name/text()")
public String getName() {
return name;
}
Надеюсь, это поможет,
Дуг