簡體   English   中英

如何讓 Jackson 使用 Google Guice Injector 創建實例?

[英]How to get Jackson to use a Google Guice Injector to create instances?

我們使用 Google Guice 進行 DI(主要使用構造函數注入)和 Jackson 進行 JSON 對象序列化。 因此,我們通過 Guice 模塊構建我們的對象圖。

我們如何提供/指導 Jackson 使用我們預先構建的 Guice Injector? 或者它是基於我們提供的 Guice 模塊的自己的注入器? 我的偏好是為它提供注入器,因為我們已經有辦法根據我們想要運行的環境/配置來控制使用哪個模塊。

這是一個單元測試:

public class Building {

    @JsonIgnore
    public final ElectricalProvider electricalProvider;

    public String name;

    @Inject
    Building(ElectricalProvider electricalProvider){
         this.electricalProvider = electricalProvider;
    }

    public String getName() { return name; }
    public void setName(String name) { this.name = name; }

}

public interface ElectricalProvider {}

public class SolarElectricalProvider implements  ElectricalProvider{}

@Test
public void testJacksonGuice() throws IOException {

    Injector injector = Guice.createInjector(new Module() {
      @Override public void configure(Binder binder) {
           binder.bind(ElectricalProvider.class).to(SolarElectricalProvider.class);
      }
    });

    Building building1 = injector.getInstance(Building.class);
    building1.setName("test building");

    ObjectMapper objectMapper = new ObjectMapper();

    byte[] buildingJsonBytes = objectMapper.writeValueAsBytes(building1);

    Building building2 = objectMapper.readValue(buildingJsonBytes, Building.class);

    assertThat(building1, is(equalTo(building2)));
    assertThat(building2.electricalProvider, is(instanceOf(SolarElectricalProvider.class)));

}

運行時生成此異常com.fasterxml.jackson.databind.JsonMappingException ,帶有此消息:找不到適合類型 [簡單類型,類構建] 的構造函數:無法從 JSON 對象實例化(缺少默認構造函數或創建者,或者可能需要添加/啟用類型信息?)

經過一番谷歌搜索,我遇到了jackson-module-guice項目,但它似乎不是我們需要的,或者沒有提供如何完成我們需要做的事情。

好吧,我認為你的方法是反模式的。 您應該僅序列化和反序列化 POJO 對象,而無需任何業務邏輯和任何其他依賴項,例如服務、存儲庫等。 你能展示你的Building類嗎? 構造函數中有什么?

您應該將Building類拆分為ServiceDomain層。 Service層將使用Domain ,您應該在那里注入所有依賴項。 Domain層將只是具有默認構造函數的 POJO bean,沒有 final 字段,只有 getter/setter 方法。

如果您需要使用最終屬性和構造函數初始化,則在Jackson 3rd Party Class With No Default Constructor 中提到的選項很少

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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