8

这是我的 XSD 文件的一个简单摘录

<?xml version="1.0" encoding="UTF-8"?>
<schema xmlns="http://www.w3.org/2001/XMLSchema" targetNamespace="ns"
    xmlns:tns="sns" elementFormDefault="qualified">

  <element name="document">
        <attribute name="title" use="required"/>
  </element>
</schema>

我使用它maven-jaxb2-plugin来生成 Java 类。该类Document具有getTitle()返回title属性文本的方法。

我想添加一个额外的方法Document

public String getStrippedTitle() {
   return getTitle().replaceAll("\\s+", "");
}

我希望我的额外方法出现在未编组对象上(而不是我只是调用它或编写包装类),因为我想将顶级未编组对象传递给字符串模板并让它遍历调用我的子元素额外的方法。

我找到了说明,但他们告诉我在Unmarshaller我的(Mac OS X、Java 7)实现上设置一个属性似乎不支持任何属性。

我该怎么做?

4

2 回答 2

8

按照 Brian Henry 给出的链接,我发现我可以在我的模式文件中执行绑定自定义内联来做我想做的事。效果与 Brian 的解决方案完全相同,但不需要引用对com.sun.xml.internal.

首先,模式文件进行了一些修改:

<schema xmlns="http://www.w3.org/2001/XMLSchema" targetNamespace="ns"
    xmlns:tns="sns" elementFormDefault="qualified"
    xmlns:jaxb="http://java.sun.com/xml/ns/jaxb"
jaxb:version="2.0">

  <element name="document">
      <annotation>
          <appinfo>
              <jaxb:class implClass="DocumentEx" />
          </appinfo>
      </annotation>
      <attribute name="title" use="required"/>
  </element>
</schema>

当模式被编译成 Java 代码时,生成的 ObjectFactory 将引用DocumentEx而不是Document. DocumentEx是我创建的一个类,如下所示:

public class DocumentEx extends Document {
   public String getStrippedTitle() {
       return getTitle().replaceAll("\\s+", "");
   }
}

Document(我正在扩展的类)仍然由 schema-to-Java 编译器生成。现在,当我解组一个文档时,我实际上得到了一个 DocumentEx 对象:

    JAXBContext jaxbContext = JAXBContext.newInstance("com.example.xml");
    Unmarshaller unmarshaller = jaxbContext.createUnmarshaller();
    unmarshaller.setSchema(testSchema);
    DocumentEx doc = (DocumentEx)unmarshaller.unmarshal(xmlFile);

Oracle提供了一些(难以解析的)文档, O'Reilly提供了一些有用的示例。

于 2013-01-11T22:01:01.403 回答
2

您可以尝试更新您在链接文档中看到的属性名称。试试这个:

com.sun.xml.internal.bind.v2.runtime.unmarshaller.UnmarshallerImpl.FACTORY

或者

"com.sun.xml.internal.bind.ObjectFactory"

我想这会让你超越我认为你看到的 PropertyException。这里最彻底的答案表明这不能保证有效,但值得一试,因为你已经走了这么远。就我看来(不远)而言,源代码似乎支持此属性。

于 2013-01-11T20:37:49.397 回答