向模式生成的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
而不是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的一些有用示例。
您可以尝试更新您在链接文档中看到的属性名称。 试试这个:
com.sun.xml.internal.bind.v2.runtime.unmarshaller.UnmarshallerImpl.FACTORY
要么
"com.sun.xml.internal.bind.ObjectFactory"
我想这会让你超越我看到的PropertyException。 这里最彻底的答案表明这不能保证有效,但值得一试,因为你已经到了这么远。 源代码,据我看(不远)似乎支持这个属性。
- 如何在Java中的新线程中播放.MIDI文件?
- 用Java中的AES算法加密
- EclipseLinke:没有名为META-INF / services / javax.persistence.spi的资源文件:找不到PersistenceProvider
- 如何生成离线Swagger API文档?
- JAXBContext.newInstance变体
- Java – 为什么我不能使用charAt()来查看char是否等于另一个?
- 在Java中运行基于cpu的简单程序的最佳线程池大小是多少
- 是否有一个类似于PropertyPlaceholderConfigurer的类用于接受XML的Spring?
- 从Java调用matlab回调/函数句柄