[英]Why do i still get warnings when using @SuppressWarnings("unchecked")?
[英]Why do I get warnings when using Spring HATEOAS Jackson serializers
Spring HATEOAS使用Jackson模塊定義並注冊 HttpMessageConverter
,該Jackson模塊包含用於將其ResourceSupport
和Resources
類型轉換為HAL JSON表示形式的序列化器。 這些模塊使用Jackson混合器將序列化器綁定到如下類型:
package org.springframework.hateoas.hal;
// Imports omitted
public abstract class ResourcesMixin<T> extends Resources<T> {
@Override
@XmlElement(name = "embedded")
@JsonProperty("_embedded")
@JsonSerialize(include = JsonSerialize.Inclusion.NON_EMPTY, using = Jackson2HalModule.HalResourcesSerializer.class)
@JsonDeserialize(using = Jackson2HalModule.HalResourcesDeserializer.class)
public abstract Collection<T> getContent();
}
此mixin導致擴展了Resources<T>
類型使用Jackson2HalModule.HalResourcesSerializer.class
序列化和反序列化。 但是,該實現似乎在嵌入資源的能力方面受到限制 。 為了解決這個限制, 我嘗試使用上述Jackson mixin中的注釋在自己的類中使用Spring HATEOAS序列化器 :
package mypackage;
// Imports omitted
public class ModelAResource extends Resource<ModelA> {
private Collection<Resource<ModelB>> modelBResources;
public ModelAResource(Model model, Collection<Resource<ModelB>> modelBResources) {
super(model);
this.modelBResources = modelBResources;
}
@JsonProperty("_embedded")
@JsonSerialize(include = JsonSerialize.Inclusion.NON_EMPTY, using = Jackson2HalModule.HalResourcesSerializer.class)
@JsonDeserialize(using = Jackson2HalModule.HalResourcesDeserializer.class)
public Collection<Resource<ModelB>> getModelBResources() {
return modelBResources;
}
}
這可行,但是導致以下WARN
記錄下來 :
[2015-01-27 23:36:41.469] boot - 12516 WARN [qtp1175418534-17] ---
MappingJackson2HttpMessageConverter: Failed to evaluate serialization for type
[class mypackage.ModelAResource]:
org.springframework.beans.factory.BeanCreationException: Error creating bean
with name
'org.springframework.hateoas.hal.Jackson2HalModule$HalResourcesSerializer':
Instantiation of bean failed; nested exception is
org.springframework.beans.BeanInstantiationException: Failed to instantiate
[org.springframework.hateoas.hal.Jackson2HalModule$HalResourcesSerializer]: No
default constructor found; nested exception is
java.lang.NoSuchMethodException:
org.springframework.hateoas.hal.Jackson2HalModule$HalResourcesSerializer<init>()
[2015-01-27 23:36:41.478] boot - 12516 WARN [qtp1175418534-17] ---
MappingJackson2HttpMessageConverter: Failed to evaluate serialization for type
[class mypackage.ModelAResource]:
com.fasterxml.jackson.databind.JsonMappingException: Class
org.springframework.hateoas.hal.Jackson2HalModule$HalResourcesSerializer has no
default (no arg) constructor
盡管有這些警告,序列化仍會產生預期的期望結果:
{
"id" : 6,
"_links" : {
"self" : {
"href" : "http://localhost:8080/modelA/6"
},
"links" : {
"href" : "http://localhost:8080/modelA/6/modelBs"
}
},
"_embedded" : {
"modelBs" : [ {
"_links": {
"self": {
"href": "http://localhost:8080/modelA/6/modelBs/1"
}
},
"id" : 1
} ]
}
}
那么,為什么要發出警告,以及為什么在發出警告的情況下仍然起作用? 該模塊和串行器是公共的 。
當您使用@JsonDeserialize(using = Jackson2HalModule.HalResourcesDeserializer.class)
,Jackson嘗試創建Jackson2HalModule.HalResourcesSerializer
的實例,該實例Jackson2HalModule.HalResourcesSerializer
,因為它沒有默認構造函數。
Spring HATEOAS(后) 直接注冊了一些Jackson的東西,包括Jackson2HalModule.HalResourcesSerializer
。 現在,序列化可以按預期工作,因為已成功注冊了序列化程序的實例。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.