代码之家  ›  专栏  ›  技术社区  ›  xyz

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

  •  -1
  • xyz  · 技术社区  · 6 年前

    我正在尝试使用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();
    

    ->结果为空指针异常… 如何注入服务?

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

    4 回复  |  直到 6 年前
        1
  •  1
  •   Thomas Fritsch Cristian Bertulli    6 年前

    因为你想在你的 SimpleClass 菜豆, 你需要注释它的属性 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 不执行任何依赖项注入。 但你可以结合 @自动售货机 -忽视 对象映射器 一些手动触发的自动布线。

    为此你需要一个 AutowireCapableBeanFactory 你在春天得到的 正常依赖注入 @ . 然后你用它 autowireBean(Object) 方法 注入豆子的 @ 性质。

    @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
  •  2
  •   NiVeR    6 年前

    如果您正在初始化 SimpleClass 如果你自己动手,那么你可以通过自动地包围小孢子来实现它。 AutowireCapableBeanFactory 在这种情况下 @Autowrire 因为spring还管理 SomeClass 对象。

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

    回到你的例子中,你不能自动运行,即使在我的指导下,因为杰克逊是实例的提供者,而杰克逊 要求 存在空构造函数。

        3
  •  0
  •   Oreste Viron    6 年前

    不可能。只有弹簧已经被安装的物体才能使用@自动售货机。

    很简单:当您用@service注释一个对象时,spring将尝试用内省来解决它的所有依赖性。

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

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

        4
  •  -1
  •   Shane Feather    6 年前

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

    如果您使用的是spring,请用@service注释您的服务类,然后与使用@autowired相反,声明您的服务私有final并使用构造函数注入它(我发现这更有效)。

    如果不使用Spring,则需要新建服务的一个实例,然后调用该实例—当然,除非它是静态的……