我们使用Google Guice进行DI(主要使用构造函数注入)和Jackson进行对象序列化到/来自JSON。因此,我们通过Guice Modules构建对象图。
我们如何提供/指示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
,并显示以下消息:找不到类型[simple type,class Building]的合适构造函数:无法从JSON对象实例化(缺少默认构造函数或创建者,或者可能需要添加/启用类型信息?)
经过一番谷歌搜索后,我遇到了jackson-module-guice项目,但它似乎并不是我们需要或不提供如何完成我们需要做的事情。
答案 0 :(得分:1)
嗯,我认为你的方法是反模式的。您应该只序列化和反序列化POJO对象,而不需要任何业务逻辑和任何其他依赖项,如服务,存储库等。你能展示你的SELECT *
FROM dcenter
JOIN dcds on dcds.d_id = dcenter.d_id
JOIN service on service.s_id = dcds.d_id
WHERE
location = ''
or name = ''
or s_name = ''
课程吗?构造函数中有什么?
您应该将Template.pricing_report.onCreated(function () {
this.date_n = new ReactiveVar();
});
Template.pricing_report.events({
'click #btn_report_filter': function (e, tmpl) {
tmpl.date_n.set(new Date(from_date));
}
});
Template.pricing_report.helpers({
'helperName':function () {
var tmpl = Template.instance();
return tmpl.date_n.get();
});
}
课程分成Building
和Building
个图层。 Service
图层将使用Domain
,您应该注入所有依赖项。 Service
图层只是POJO bean的默认构造函数,没有final字段,只有getter / setter方法。
如果您需要使用最终属性和构造函数初始化,那么Jackson 3rd Party Class With No Default Constructor
中提到的选项很少