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

时间:2015-06-05 00:01:05

标签: java json jackson guice jackson-modules

我们使用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项目,但它似乎并不是我们需要或不提供如何完成我们需要做的事情。

1 个答案:

答案 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(); }); } 课程分成BuildingBuilding个图层。 Service图层将使用Domain,您应该注入所有依赖项。 Service图层只是POJO bean的默认构造函数,没有final字段,只有getter / setter方法。

如果您需要使用最终属性和构造函数初始化,那么Jackson 3rd Party Class With No Default Constructor

中提到的选项很少