如何使用ObjectMapper转换对象并将依赖项注入其中

时间:2018-06-08 14:35:19

标签: java spring jackson

我正在尝试使用jackson ObjectMapper将Object转换为具体类,并在转换后注入依赖项。以下是示例:

public class SimpleClass{
    private String parameter;
    @JsonIgnore
    private SomeService service;

    /** getters and setters **/
    public void doSomethingFromService(){
        //call some methods from the service
    }
}

尝试反序列化对象后(value是包含参数的map):

ObjectMapper om = new ObjectMapper();
om.convertValue(value,SimpleClass.class).doSomethingFromService();

- >导致NullPointerException ... 如何注入服务?

我可以从上下文中获取服务并使用默认构造函数注入它吗?

4 个答案:

答案 0 :(得分:2)

如果您正在自己初始化SimpleClass对象,那么您可以通过使用AutowireCapableBeanFactory自动装配paritcular实例来使其工作,在这种情况下,服务的@Autowrire将起作用Spring还管理SomeClass对象的部分实例。

那就是说,这不是要走的路。数据对象应与业务逻辑隔离。

回到你的情况,即使按照我的方式你也不能自动装配,因为Jackson是实例的提供者,而Jackson 需要存在空构造函数。

答案 1 :(得分:1)

由于您需要在SimpleClass bean中进行某种自动连接, 您需要使用SomeService service注释其属性@Autowired

public class SimpleClass {

    private String parameter;

    @JsonIgnore
    @Autowired
    private SomeService service;

    // getter and setter for parameter (omitted here for brevity)

    public void doSomethingFromService(){
        //call some methods from the service
    }
}

正如其他人已经说过的那样,ObjectMapper没有进行任何依赖注入。 但是你可以合并@Autowired - 忽略ObjectMapper 有一些手动触发的自动接线。

为此你需要一个AutowireCapableBeanFactory,你可以通过Spring获得 使用@Autowired进行正常依赖注入。 然后使用其autowireBean(Object)方法 注入bean的@Autowired属性。

@Autowired
private  AutowireCapableBeanFactory autowireCapableBeanFactory;

public void doSomething(Map<String, Object> value) throws Exception {
    ObjectMapper om = new ObjectMapper();
    SimpleClass bean = om.convertValue(value, SimpleClass.class);
    autowireCapableBeanFactory.autowireBean(bean);
    bean.doSomethingFromService();
}

答案 2 :(得分:0)

这是不可能的。只有使用spring实例化的对象才能使用@Autowired。

这很简单:当你使用@Service注释一个对象时,spring会尝试通过内省来解决所有它的依赖。

对于杰克逊(或者如果你试图自己实现一个物体),你完全不在春天的范围内。

我应该做的,你想做的事情(即使有可能)也不是一个好习惯。您不应该将数据对象与业务处理混合在一起。

答案 3 :(得分:-1)

只有像Spring这样的框架才能注入服务,如前所述。

如果您正在使用Spring,请使用@Service注释您的服务类,然后使用@Autowired声明您的服务私有final并使用构造函数注入它(IMO我认为这更好用)。

如果您没有使用Spring,那么您需要新建一个服务实例,然后调用该实例 - 除非它当然是静态的......