我正在尝试使用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 ... 如何注入服务?
我可以从上下文中获取服务并使用默认构造函数注入它吗?
答案 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,那么您需要新建一个服务实例,然后调用该实例 - 除非它当然是静态的......