- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我们使用 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
类拆分为 Service
和 Domain
层。 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/
我是一名优秀的程序员,十分优秀!