を使用してデータをローカルに永続化しようとしていGluonClient
ます。いくつかの要素で散発的に機能していますが、ほとんどの要素でエラーがスローされます。
私は次のように初期化します:
GluonClient localClient = GluonClientBuilder.create()
.operationMode(OperationMode.LOCAL_ONLY)
.build();
RestClient
REST API からデータを取得するためにを使用しています。リストが初期化されたら、データをローカルに保存しようとします (この読み取りに GluonClient を使用しようとしましたが、成功しませんでした):
RestClient apiClient = RestClient.create().method("GET")
.host("http://localhost:8080/api")
.path("/path/to/data")
.queryParam("token","mytoken");
JobsIterableInputConverter<Job> converter = new JobsIterableInputConverter<>(Job.class);
GluonObservableList<Job.class> jobs = (DataProvider.retrieveList(apiClient.createListDataReader(converter)));
jobs.initializedProperty((obv,ov,nv)->{
saveJobList(jobs);
});
private void saveJobListLocally(GluonObservableList<Job> list){
GluonObservableList<Job> eqs = DataProvider.retrieveList(gluonClient.createListDataReader("jobs", Job.class));
eqs.initializedProperty().addListener((obv, ov, nv) -> {
if (nv && eqs.isEmpty()) {
eqs.addAll(list);
}
});
}
これは、一部のデータに対して時々機能します。約 4 (常に 4 とは限りません)の 168 個の Job オブジェクトが保存され、残りは例外を生成します。
javax.json.stream.JsonParsingException: Invalid token=EOF at (line no=1, column no=0, offset=-1). Expected tokens are: [CURLYOPEN, SQUAREOPEN]
ローカル データを取得するには、次のように呼び出します。
jobs = DataProvider.retrieveList(gluonClient.createListDataReader("jobs", Job.class));
これはうまくいきます。
-保存された ~4 個のオブジェクトにアクセスして使用できますが、残りは失われます。
-保存される ~4 個のオブジェクトは、テストごとに同じではありません (最も紛らわしい部分)。
- 各ジョブ オブジェクトのデータを同一にして、データが無効かどうか、または無効な文字があるかどうかをテストしましたが、同じ問題が発生しました。を使用して、以前に他のアプリケーションでデータを解析して使用したことがありますorg.json
。
-場合によっては、「失われた」オブジェクトごとに、ジョブ ファイルに加えて、ファイル名として UID を持つファイルが生成されます 。
-例外がスローされていないことを 2 回確認しましたが、ほとんどのデータがまだ欠落していました。
-Job Class はIntegerProperty
、StringProperty
データ型に と を使用します。注釈付きのゲッター@XMLElement
から見ている動作にGluonClient
は一貫性がありません。
使用しようとしましFileClient
たが、リストでは機能しません (このトラックに参加する必要がありますか?)。
GluonClient
を使用して、ローカル コンテンツをリストとして保存および処理するにはどうすればよいですか?
使用するjavafxportsVersion= '8.60.7'
public class JobsIterableInputConverter<E> extends InputStreamIterableInputConverter<E> implements Iterator<E> {
private JsonArray jsonArray = null;
private int index;
private final JsonConverter<E> converter;
public JobsIterableInputConverter(Class<E> targetClass)
{
converter = new JsonConverter<>(targetClass);
}
@Override
public boolean hasNext()
{
if (jsonArray == null) {
return false;
}
return index < jsonArray.size();
}
@Override
public E next()
{
JsonObject jsonObject = jsonArray.getJsonObject(index++);
return converter.readFromJson(jsonObject);
}
@Override
public Iterator<E> iterator()
{
index = 0;
try (JsonReader reader = Json.createReader(getInputStream())) {
JsonObject jsonObject = reader.readObject();
jsonArray = jsonObject.getJsonArray("jobs");
}
return this;
}
}
API の戻り形式:
{"jobs":[
{"id":0},
{"id":1}
]}