在本地保存列表时 GluonClient 数据丢失
GluonClient data loss when saving list locally
我正在尝试使用 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 个作业对象被保存其余的生成异常:
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
在其他应用程序中解析和使用过数据。
-偶尔会为每个 'lost' 对象生成 文件,除了作业文件外,还会为每个以 UID 作为文件名的对象生成文件。
-两次我都没有看到异常抛出,但大部分数据仍然丢失。
-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 Return 格式:
{"jobs":[
{"id":0},
{"id":1}
]}
当将列表中的许多项目存储到本地存储时确实存在一个错误。 JSON 损坏的原因是可能同时访问存储对象的本地文件。该错误已通过以下拉取请求修复:https://bitbucket.org/gluon-oss/gluon-connect/pull-requests/1/make-sure-there-is-no-simultaneous-access/diff
计划在本周某处发布新版本。
我正在尝试使用 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 个作业对象被保存其余的生成异常:
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
在其他应用程序中解析和使用过数据。
-偶尔会为每个 'lost' 对象生成 文件,除了作业文件外,还会为每个以 UID 作为文件名的对象生成文件。
-两次我都没有看到异常抛出,但大部分数据仍然丢失。
-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 Return 格式:
{"jobs":[
{"id":0},
{"id":1}
]}
当将列表中的许多项目存储到本地存储时确实存在一个错误。 JSON 损坏的原因是可能同时访问存储对象的本地文件。该错误已通过以下拉取请求修复:https://bitbucket.org/gluon-oss/gluon-connect/pull-requests/1/make-sure-there-is-no-simultaneous-access/diff
计划在本周某处发布新版本。