gpt4 book ai didi

java - 如何让 Jackson 使用 Google Guice Injector 创建实例?

转载 作者:行者123 更新时间:2023-12-01 11:27:57 24 4
gpt4 key购买 nike

我们使用 Google Guice 进行 DI(主要使用构造函数注入(inject)),并使用 Jackson 进行与 JSON 之间的对象序列化。因此,我们通过 Guice 模块构建对象图。

我们如何提供/指导 Jackson 使用我们预先构建的 Guice 注入(inject)器?或者它是基于我们提供的 Guice 模块的自己的注入(inject)器?我的偏好是为其提供注入(inject)器,因为我们已经有办法根据我们想要运行的环境/配置来控制使用哪个模块。

这是一个单元测试:

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,您应该在其中注入(inject)所有依赖项。 Domain 层将只是带有默认构造函数的 POJO bean,没有最终字段,只有 getter/setter 方法。

如果您需要使用最终属性和构造函数初始化,您几乎没有什么选择,如 Jackson 3rd Party Class With No Default Constructor 中提到的。

关于java - 如何让 Jackson 使用 Google Guice Injector 创建实例?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30656197/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com