問題タブ [jsonschema2pojo]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
java - 動的にロードされた pojo クラスの Jackson デシリアライゼーション/TypeReference
JSON
入力 Pojo インスタンスを取得する必要があり、Jackson 2
ライブラリを使用しており、以下のreadValue
メソッドは typeReferencing を使用して逆シリアル化できます。
しかし、問題は、POJO
実行時に動的に作成およびロードされるため、上記のステートメントの完全修飾クラス (POJO_ClassName) 名がないため、どうすればインスタンス/オブジェクトにアクセスできるかということですJSON
。POJO
注:jsonSchema2pojo
ライブラリを使用POJO
して、実行時にクラスを生成します。
ここにコードスニペットがあります。実行時に生成するPOJO
ために使用しJSON
、試しています
しかし、com.EnrichmentService.Thread72.EsRootDoc
まだ生成されていないため、コンパイラはクラスが見つかりませんでした。
主なポイント:
1) 実行時に同じ Pojo クラスが繰り返し生成されますが、JSON 入力が毎回変化するため、プロパティが異なります。
2) Object pojo =mapper.readValue(json,Class.forName("com.EnrichmentService.Thread72.EsRootDoc")); も試しました class.forName は既存のクラスを置き換えません!
編集 24 Aug17 - これが私のカスタムクラスローダーです:
注: インデクサーは、実行時に動的な EsRootDoc/POJO クラスをロードするクラスです。
別の方法として、上記の TestClassLoader カスタム クラス ローダーを使用してみましたが、次のようになります。
古い回答を参照 @ How to replace classes in a running application in java ?
Edit2: 24Aug17 例外が直面している stackTrace はこちら: https://pastebin.com/ckCu2uWx
java - ツールなしでクラスローダーの問題をデバッグする方法
基本的に、クラスローダーには階層があり、シーケンスのデフォルトクラスローダーは以下のように実行されることを知っています:-
a) ブートストラップ クラス ローダー: 最初に実行され、すべての Java クラスなどをロードします。
b) Extclassloader : Extclassloaders は、すべての ext フォルダー jar と Java ライブラリをロードします。
c) アプリケーションクラスローダー: プログラムが実行され、リンクされたクラスが見つかると、このクラスローダーを使用してクラスパスからロードされます。
現在、さまざまなjson入力に対して実行時にpojoクラスが生成されており、最初にロードされたPojoクラスは、カスタムクラスローダーを使用しても置き換えられないようです(通常のクラスローダーとして、ロードされている場合はクラスが既にロードされているかどうかを最初に確認し、クラスをロードしません下の画像は、通常のデフォルトのクラスローダーの動作です)。
だから今、私は自分のクラスが置き換えられているかどうかをどのように知ることができますか? 一部のリスナーを jvm のクラスにリンクして、クラスが置き換えられたことを知らせることはできますか? クラスプロセスのリロードまたは置換のデバッグを実行できるデバッグ手順を探しています。
注:使用されているカスタムクラスローダーを使用すると、同じクラスがjvmの新しいカスタムクラスローダーインスタンスにロードされたようです。
私がまだ答えを見ているアプローチの問題(おそらく)jsonSchema2pojo jackson deserialisationの問題を見てください。json を動的に作成された Pojo に逆シリアル化することが要件であるため、上記の質問のように実行時に pojo クラスを作成した後に json を逆シリアル化する必要がある場合、どのようなアプローチを提案しますか?
json - JSON データを変更せずに汎用 Java クラスを作成する
変更できないサードパーティからの JSON データを受信するという非常にユニークな使用例があります。
次に、このデータを使用する複数のコンポーネントがあります。JSON 全体を提供するのではなく、これらのコンポーネントをより扱いやすい Java オブジェクトとして提供したいと考えています。そこで、jsonschema2pojo ツールを使用して、この JSON から JAVA オブジェクトを作成します。
さて、問題は、このライブラリを使用すると、モバイル、デスクトップ、タブレット用に 3 つの異なる Java ファイルが作成されることです (これは正しい方法です) が、この情報を使用するコンポーネントは、モバイル用に異なる方法で処理するのではなく、ジェネリック クラスを必要とします。デスクトップとタブレット。また、より多くのデバイスを追加でき、特定のクラスを保持したくないコンポーネントがたくさんあるためです。モバイル/デスクトップまたはタブレットの情報を保存できるフィールド deviceType を持つ一般的な「デバイス」を 3P が提供してくれることを望みますが、それには多くの時間がかかります。その間、あなたが考えることができる解決策はありますか?