2

假设我有一个香草 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 来指定这些转换,而不是手动做这类事情?

4

3 回答 3

1

Dozer bean 映射器 (http://dozer.sourceforge.net/) 对于映射相似的 bean 很有用。默认情况下,它映射具有相同名称的属性,但可以通过 xml 轻松自定义不同的映射。此映射的示例可在http://dozer.sourceforge.net/documentation/mappings.html找到

于 2011-03-30T22:02:23.247 回答
1

我认为仅使用 JXPath 是不可能的,因为它是 XPath 实现而不是 XSLT 实现。XSLT 使用 XPath 作为语言的一部分,但不仅如此。

您可以尝试将 bean 序列化为 XML,使用 XSLT 转换 XML 并将生成的 XML 反序列化为目标类。因此,对于您的 person 对象,您可能会得到

<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 类的实例。

注意:bean 的 XML 表示是为了这个示例而组成的。实际上,您既可以使用 java.beans.XMLEncoder,也可以寻找任何其他的 Java/XML 绑定实现(JAXB 等...)

于 2009-03-06T09:53:51.010 回答
0

我确信这是可能的,但它似乎有点令人费解。一方面,您提到的两个类之间似乎存在继承关系。如果是这样,您可能应该有一个接受其他类型作为参数的构造函数。

如果没有明显的继承关系,为什么不直接使用 javabeans setter 呢?这里有什么需要使用 JXPath?那几乎肯定会更慢。

于 2009-03-06T09:48:24.550 回答