[英]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
類拆分為Service
和Domain
層。 Service
層將使用Domain
,您應該在那里注入所有依賴項。 Domain
層將只是具有默認構造函數的 POJO bean,沒有 final 字段,只有 getter/setter 方法。
如果您需要使用最終屬性和構造函數初始化,則在Jackson 3rd Party Class With No Default Constructor 中提到的選項很少
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.