DI には Google Guice (主にコンストラクター インジェクションを使用) を使用し、JSON との間のオブジェクトのシリアル化には Jackson を使用します。そのため、Guice モジュールを使用してオブジェクト グラフを構築します。
Jackson に事前構築済みの Guice インジェクターを使用するように提供/指示するにはどうすればよいですか? それとも、私たちが提供する 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プロジェクトに出くわしましたが、必要なことを達成する方法について、必要なものではないように見えます。