Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/315.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在两个不同的JAVA包下使用相同的对象?_Java_Xml_Generics_Jaxb - Fatal编程技术网

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

在两个不同的JAVA包下使用相同的对象?,java,xml,generics,jaxb,Java,Xml,Generics,Jaxb,我有多个具有类似JAXB JAVA对象的包。java对象是从不同的XSD自动生成的,似乎具有相似的结构,但我不能假设没有区别,也不能将两个相似的XML文档封送到相同的java类,即使它们有很多相似之处 我试图找到一种减少代码重复的方法,在从类似对象但不同的包中获取数据时,不要为每个具有相同对象的包再次编写相同的代码 public void function1(JAXBElement documentJAXB) { ObjType obj = new ObjType (); /

我有多个具有类似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()));
    ....
}
有没有一种方法可以组合此代码?我想到了泛型,但它无法编译函数调用,例如,因为这些类没有实现接口


有没有一种方法可以动态定义包名?

我认为泛型是一种方法。你可以试试这样的东西

class SomeClass<T> {
   public void doSomethingInteresting(T document) {
       ....
       obj.setMsgid(doc.getFIToFIPmtStsRpt().getGrpHdr().getMsgId());
       ....
   }
}
class-SomeClass{
公共无效doSomethingInteresting(T文件){
....
obj.setMsgid(doc.getfitofipmtsrpt().getGrpHdr().getMsgId());
....
}
}
然后按如下方式调用此函数

....
SomeClass<path.to.package2.Document> utility = new SomeClass<>();
utility.doSomethingInteresting(documentJAXB.getValue())
....
。。。。
SomeClass实用工具=新的SomeClass();
utility.doSomethingInteresting(documentJAXB.getValue())
....

我认为这应该会让您开始……

也许您可以使用JAXB绑定文件将生成的XSD的一部分生成到某个包中

下面显示了从命名空间到包的绑定。根据xsd结构的不同,您可能需要选择不同的内容(complextype、element等)



您可以为它们创建一个公共接口,并在jaxb设置中进行设置,与此类似:我需要创建
文档
类和所有相互调用方法的嵌套类的接口。。我希望找到一种更好更快的方法来实现这一点。根据具体情况,有时最好不要尝试最大限度地重用对象。如果XSD共享相同的对象,为什么它们不在相同的名称空间中?这将使它们在同一个包中生成。如果XSD不相关,并且它们使用相同的对象(巧合),那么我会让它们单独存在,并使它们能够独立发展。XSD适用于不同类型的消息,其结构类似70%,我们需要从这些消息中获得的数据存在于公共对象中,因此我们的情况没有任何差异,并且由于XSD的性质,我们无法将它们组合在同一个包中。只需要为您希望以相同方式处理的类似类创建接口。当然,这可能会很麻烦,但你会得到类型安全性。另一种方法可能是使用反射,但我不建议这样做,它只是混淆了意图。这将在编译时失败,因为编译器不会识别名为
getfitofipmtsrpt().getGrpHdr().getMsgId()
t的方法应该这样扩展文档,然后,您需要为所有需要的类提供一个公共接口。
<jaxb:bindings 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xs="http://www.w3.org/2001/XMLSchema" 
xmlns:jaxb="http://java.sun.com/xml/ns/jaxb"
xmlns:xjc="http://java.sun.com/xml/ns/jaxb/xjc"
jaxb:version="2.1">
<jaxb:bindings schemaLocation="--schemalocation here--">
    <jaxb:bindings node="//xs:schema[@targetNamespace='--namespace here--']">
        <jaxb:schemaBindings>
            <jaxb:package name="--packagename here--" />
        </jaxb:schemaBindings>
    </jaxb:bindings>
</jaxb:bindings>