在两个不同的包JAVA下使用相同的对象?

时间:2017-06-15 07:02:46

标签: java xml generics jaxb

我有多个包含类似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,例如,因为没有这些类实现的接口。

有没有办法动态定义包名?

2 个答案:

答案 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())
....

我认为这应该让你去......