英文:
Spring Data Elasticsearch documents not being deserialized
问题
Spring Data Elasticsearch 版本:3.2.6.RELEASE
Elasticsearch 版本:7.6.2
我正在尝试使用以下代码对 MerchantCategory
列表进行反序列化:
SearchQuery getAllQuery = new NativeSearchQueryBuilder()
.withQuery(matchAllQuery())
.build();
return elasticsearchTemplate.queryForList(getAllQuery, MerchantCategory.class);
MerchsntCategory
列表上的字符串 id 字段被正确设置,但其他字段仍然保持为 null
。
我已经确认文档字段在 Elasticsearch 中通过 Kibana 进行了持久化。
当启动 Spring Boot 应用程序时,字段映射会被提交到 Elasticsearch:
request [PUT http://127.0.0.1:9200/merchantcategory/_mapping/merchantcategory?master_timeout=30s&include_type_name=true&timeout=30s] 返回了 1 个警告: [299 Elasticsearch-7.6.2-ef48eb35cf30adf4db14086e8aabd07ef6fb113f "[types removal] Using include_type_name in put mapping requests is deprecated. The parameter will be removed in the next major version."]
以下是 MerchantCategory
类的定义:
@NoArgsConstructor
@AllArgsConstructor
@Builder
@Getter
@Setter
@Document(indexName = "merchantcategory", type = "merchantcategory")
public class MerchantCategory implements Serializable {
@Id
@JsonIgnore
private String id;
@SerializedName("ParentId")
private Long parentId;
@SerializedName("Name")
private String name;
@SerializedName("Description")
private String description;
@SerializedName("UrlName")
private String urlName;
@SerializedName("Id")
private Long categoryId;
@SerializedName("MerchantsInCategory")
private List<MerchantCategoryRelationship> merchants;
}
我使用 gson
进行序列化:
val bulkRequest = new BulkRequest();
entities.subList(startIndex, endIndex).forEach(e ->{
String source = gson.toJson(e);
val indexRequest = new IndexRequest(index).source(source, XContentType.JSON).type(type);
bulkRequest.add(indexRequest);
});
highLevelClient.bulkAsync(bulkRequest, RequestOptions.DEFAULT, getListener());
我还尝试过使用 merchantCategoryElasticsearchRepository.findAll();
进行相同的操作,但问题仍然存在。
为什么只有字符串 id 字段被序列化,而其他字段却没有被序列化呢?
英文:
Spring Data Elasticsearch version: 3.2.6.RELEASE
Elasticsearch version: 7.6.2
I am attempting to deserialize a list of MerchantCategory
using:
SearchQuery getAllQuery = new NativeSearchQueryBuilder()
.withQuery(matchAllQuery())
.build();
return elasticsearchTemplate.queryForList(getAllQuery, MerchantCategory.class);
The String id field is correctly set on the list of MerchsntCategory
but the other fields remain null
.
I have confirmed that the documents fields are persisted in Elasticsearch using Kibana.
The field mappings are submitted to Elasticsearch when the Spring Boot application is started:
request [PUT http://127.0.0.1:9200/merchantcategory/_mapping/merchantcategory?master_timeout=30s&include_type_name=true&timeout=30s] returned 1 warnings: [299 Elasticsearch-7.6.2-ef48eb35cf30adf4db14086e8aabd07ef6fb113f "[types removal] Using include_type_name in put mapping requests is deprecated. The parameter will be removed in the next major version."]
Here is the MerchantCategory
class:
@NoArgsConstructor
@AllArgsConstructor
@Builder
@Getter
@Setter
@Document(indexName = "merchantcategory", type = "merchantcategory")
public class MerchantCategory implements Serializable {
@Id
@JsonIgnore
private String id;
@SerializedName("ParentId")
private Long parentId;
@SerializedName("Name")
private String name;
@SerializedName("Description")
private String description;
@SerializedName("UrlName")
private String urlName;
@SerializedName("Id")
private Long categoryId;
@SerializedName("MerchantsInCategory")
private List<MerchantCategoryRelationship> merchants;
}
I use gson
to serialize:
val bulkRequest = new BulkRequest();
entities.subList(startIndex, endIndex).forEach(e ->{
String source = gson.toJson(e);
val indexRequest = new IndexRequest(index).source(source, XContentType.JSON).type(type);
bulkRequest.add(indexRequest);
});
highLevelClient.bulkAsync(bulkRequest, RequestOptions.DEFAULT, getListener());
I have also tried the same thing with merchantCategoryElasticsearchRepository.findAll();
and have the same issue.
Why is it that the only field that is serialized is the String id field and not the others?
答案1
得分: 1
你使用Jackson作为序列化器吗?
那么你需要使用:@JsonProperty
@JsonProperty("UrlName")
private String urlName;
如果你正在使用GSON作为序列化器,你需要使用@SerializedName
。
@SerializedName("UrlName")
private String urlName;
英文:
Do you use Jackson as serializer?
Than you have to use: @JsonProperty
@JsonProperty("UrlName")
private String urlName;
If you are using GSON as serializer you have to use @SerializedName
.
@SerializedName("UrlName")
private String urlName;
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论