簡體   English   中英

為什么在使用Spring HATEOAS Jackson序列化器時收到警告

[英]Why do I get warnings when using Spring HATEOAS Jackson serializers

Spring HATEOAS使用Jackson模塊定義注冊 HttpMessageConverter ,該Jackson模塊包含用於將其ResourceSupportResources類型轉換為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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM