2017-06-15 19 views
1

私は、同様のJAXB JAVAオブジェクトを持つ複数のパッケージを持っています。 Javaオブジェクトは、異なるXSDから自動的に生成され、同様の構造を持つように見えますが、違いはないと仮定することはできません。類似しているにもかかわらず、2つの同様のXMLドキュメントを同じJAVAクラスにマーシャリングできません。2つの異なるパッケージの下で同じオブジェクトを操作する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())); 
    .... 
} 

第二の機能は

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())); 
    .... 
} 

このコードを結合する方法はありpackage2の下で同様のオブジェクトに同じ動作を適用しますか?私はジェネリックスを考えましたが、例えば、これらのクラスが実装するインタフェースがないため、関数呼び出しをコンパイルできません。getFIToFIPmtStsRpt

パッケージ名を動的に定義する方法はありますか?

+1

あなたが彼らのために共通のインターフェースを作成し、と同様に、JAXBの設定でそれを設定することができますこれは:https://stackoverflow.com/questions/1271980/generating-a-jaxb-class-that-implements-an-interface – abbath

+0

'document'クラスと、他のメソッドを呼び出すすべてのネストされたクラスへのインターフェイスを作成する必要があります私はこれを行うためのより良い、より速い方法を見つけることを望んでいた。 – KAD

+0

状況によっては、オブジェクトを最大限に再利用しようとしない方が良い場合があります。 XSDが同じオブジェクトを共有する場合、なぜ同じ名前空間にないのでしょうか?それはそれらが同じパッケージで生成されるようにします。 XSDが関連しておらず、同じオブジェクトを(偶然によって)使用する場合、私はそれらを別々に生きておき、互いに独立して進化させることができます。 – Manuel

答えて

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

私は、これはあなたがおそらくあなたが特定のパッケージに生成されたXSDの部品を作るためにJAXBバインディングファイルを使用することができます...

+0

コンパイラは 'getFIToFIPmtStsRpt()。getGrpHdr()。getMsgId() 'というメソッドを識別しないので、コンパイル時には失敗します。 – KAD

+1

Tはこのようにドキュメントを拡張しなければなりません。必要です。 – abbath

0

を軌道に乗るべきだと思います。

以下は、名前空間からパッケージへのバインディングを示しています。 XSDの構造によっては、あなたが別の何かを選択する必要があるかもしれません(のcomplexType要素を、...)

<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> 

関連する問題