向模式生成的JAXB类添加额外的方法

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

      

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

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

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

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

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

我该怎么做?

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

首先,模式文件有所修改:

           

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

 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的一些有用示例。

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

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

要么

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

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