Возможно ли преобразовать javabeans с помощью XSLT и JXPath? - PullRequest
2 голосов
/ 06 марта 2009

Предположим, у меня есть ванильный javabean:

class Person {
  String firstName;
  String lastName;
  ...
}

Теперь предположим, что я хочу преобразовать это в другой javabean:

class Human {
  String name;
  ...
}

В настоящее время я использую JXPath , чтобы помочь мне преобразовать одно в другое:

JXPathContext personContext = JXPathContext.newContext(person);
JXPathContext humanContext = JXPathContext.newContext(new Human());
humanContext.setValue("name", personContext.getValue("firstName") +
                              personContext.getValue("lastName"));

Вместо того, чтобы делать подобные вещи вручную, есть ли способ использовать, например, XSLT с JXPath для указания этих преобразований?

Ответы [ 3 ]

1 голос
/ 06 марта 2009

Я думаю, что это невозможно только с JXPath, так как это реализация XPath, а не реализация XSLT. XSLT использует XPath как часть языка, но это больше, чем это.

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

<person>
    <firstName>John</firstName>
    <lastName>Doe</lastName>
</person>

Вы можете использовать XSLT с таким шаблоном, как этот

<xslt:template match="/person">
    <human>
        <name><xslt:value-of select="./firstName"/> <xslt:value-of select="./lastName"/></name>
    </human>
</xslt:template>

Это должно привести к документу результата, как это:

<human>
    <name>John Doe</name>
</human>

Этот документ можно затем десериализовать в экземпляр класса Human.

Примечание: XML-представления bean-компонентов составлены для примера. На самом деле, вы можете использовать java.beans.XMLEncoder или искать любую другую реализацию связывания Java / XML, которая существует (JAXB и т. Д.)

1 голос
/ 31 марта 2011

Dozer bean mapper (http://dozer.sourceforge.net/) полезен для отображения схожих bean-компонентов. По умолчанию он отображает свойства с одинаковыми именами, но его можно легко настроить для другого отображения с помощью xml. в http://dozer.sourceforge.net/documentation/mappings.html

0 голосов
/ 06 марта 2009

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

Если нет очевидного отношения наследования, почему бы просто не использовать установщик javabeans? В чем здесь необходимость использовать JXPath? Это почти наверняка будет медленнее.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...