当前位置: 首页 > 知识库问答 >
问题:

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

宦源
2023-03-14

我试图使用jackson ObjectMapper将对象转换为一个具体的类,并在转换后注入依赖项。以下是一个例子:

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

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

尝试反序列化对象后(值为包含参数的映射):

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

-

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

共有3个答案

邢心水
2023-03-14

这是不可能的。只有与spring关联的对象才能使用@Autowired。

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

对于jackson(或者如果你试图自己实例化一个对象),你完全超出了spring的范围。

我应该知道,你试图做的(即使可能)不是一个好的实践。您不应该将数据对象与业务处理混为一谈。

吴德辉
2023-03-14

由于您希望在SimpleClassbean中实现某种自动连接,因此需要使用@Autowired注释其属性SomeService服务

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执行任何依赖项注入。但是您可以将忽略ObjectMapper与一些手动触发的自动布线相结合。

为此,您需要一个autowiredcapablebeanfactory,它是通过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();
}
邵璞
2023-03-14

如果您自己正在初始化SimpleClass对象,那么您可以通过使用AutowireCapableBeanFactory自动连接paritcular实例使其工作。在这种情况下,服务的@Autowrire将工作,因为Spring还管理SomeClass对象的特定实例。

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

回到您的案例,您甚至不能以我定义的方式自动连线,因为Jackson是实例的提供者,并且Jackson要求存在空构造函数。

 类似资料:
  • 问题内容: 如何在不使用调用的情况下使用Spring将依赖项注入? 问题答案: 由于Servlet 3.0 ServletContext具有“ addListener”方法,因此可以通过如下代码添加而不是在web.xml文件中添加侦听器: 这意味着你可以正常地注入“ MyHttpSessionListener”中,并且,只要你的应用程序上下文中存在bean,就会使侦听器注册到容器中

  • 问题内容: 假设我们有一个课程: 然后,我们创建了此类的对象(或者其他一些框架也创建了此类的实例)。 是否仍然可以注入依赖项?就像是: (我认为Google Guice有这样的内容) 问题答案: 你可以使用的方法执行此操作。你将其传递给一个任意对象,Spring会像对待它自己创建的对象一样对待它,并将应用各种自动装配的片段。 要掌握,只需自动连线即可:

  • 问题内容: 假设我们有一个课程: 然后,我们创建了此类的对象(或者其他一些框架也创建了此类的实例)。 是否仍然可以注入依赖项?就像是: 问题答案: 你可以使用的方法执行此操作。你将其传递给一个任意对象,Spring会像对待它自己创建的对象一样对待它,并将应用各种自动装配的片段。 要掌握,只需自动连线即可:

  • 问题内容: 我想将依赖项注入。但是,我的方法不起作用。我可以看到Spring正在调用我的setter方法,但是稍后在调用when时,该属性为。 这是我的设置: ServletContextListener: web.xml :(这是文件中的最后一个侦听器) applicationContext.xml: 输出: 实现此目的的正确方法是什么? 问题答案: 我通过删除侦听器bean并为我的属性创建了一

  • 本文向大家介绍webapi中如何使用依赖注入,包括了webapi中如何使用依赖注入的使用技巧和注意事项,需要的朋友参考一下 本篇将要和大家分享的是webapi中如何使用依赖注入,依赖注入这个东西在接口中常用,实际工作中也用的比较频繁,因此这里分享两种在api中依赖注入的方式Ninject和Unity;由于快过年这段时间打算了解下vue.js,所以后面对webapi的分享文章可能会慢点更新,希望支持

  • 我已经使用GoogleGuice几个月了。我对它很满意,但似乎我用错了。我创造了很多辅助注射,有时还有两个注射器。 因此,我想了解这里的一般原则。 是否应该为连接主类所有内容的所有应用程序配备一个喷油器? 最佳实践是关于从应用程序一开始就尝试在构造函数中注入大量内容吗?(我看到了测试的优势) 我的主要问题是,有时我觉得某些对象组的创建属于某个组件。有必要封装它吗?你会如何处理? 当您拥有一个重要的