我有多个包含类似JAXB JAVA对象的包。 java对象是从不同的XSD自动生成的,似乎有类似的结构,但我不能假设没有区别,我不能将两个相似的XML文档编组到相同的JAVA类,即使它们有很多相似之处。
我正在尝试找到一种方法来减少代码重复,并且在从类似对象但不同包中获取数据时,不会为具有相同对象的每个包再次编写相同的代码。
public void function1(JAXBElement documentJAXB)
{
ObjType obj = new ObjType ();
// parse the document
path.to.package1.Document doc = (path.to.package1.Document) documentJAXB.getValue();
obj.setMsgid(doc.getFIToFIPmtStsRpt().getGrpHdr().getMsgId());
obj.setCredtm(Util.getSqlDate(doc.getFIToFIPmtStsRpt().getGrpHdr().getCreDtTm()));
....
}
第二个函数对package2
public void function2(JAXBElement documentJAXB)
{
ObjType obj = new ObjType ();
// parse the document
path.to.package2.Document doc = (path.to.package2.Document) documentJAXB.getValue();
obj.setMsgid(doc.getFIToFIPmtStsRpt().getGrpHdr().getMsgId());
obj.setCredtm(Util.getSqlDate(doc.getFIToFIPmtStsRpt().getGrpHdr().getCreDtTm()));
....
}
有没有办法合并这段代码?我想到了泛型但是它无法编译函数调用getFIToFIPmtStsRpt
,例如,因为没有这些类实现的接口。
有没有办法动态定义包名?
答案 0 :(得分:1)
也许您可以使用JAXB绑定文件将生成的XSD部分生成到某个包中。
下面显示了从命名空间到包的绑定。根据xsd结构,您可能需要选择不同的东西(complextype,element,...)
:so ~/.vim/macros/fix-my-report.vim
答案 1 :(得分:0)
我认为泛型是可行的方法。你可以尝试这样的事情;
class SomeClass<T> {
public void doSomethingInteresting(T document) {
....
obj.setMsgid(doc.getFIToFIPmtStsRpt().getGrpHdr().getMsgId());
....
}
}
然后按如下方式调用此函数;
....
SomeClass<path.to.package2.Document> utility = new SomeClass<>();
utility.doSomethingInteresting(documentJAXB.getValue())
....
我认为这应该让你去......