2

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プロジェクトに出くわしましたが、必要なことを達成する方法について、必要なものではないように見えます。

4

1 に答える 1