当杰克逊反序列化JSON请求时,如何注入bean?

时间:2019-10-04 15:20:43

标签: spring spring-mvc jackson

我有一个Spring Web应用程序,该应用程序接收需要作为Bean注入的对象。有没有一种简单的方法可以指示Jackson在反序列化时将实例创建为Spring bean,而无需实现自定义反序列化器?

我的代码如下:

我有一个A类,其中某些属性是自动连接的,而有些则不是。

@Component
public class A {

    private String value;

    @Autowired
    private Obj autowiredObj;

    // getter & setter
}

另一个类B具有几个与类A类似的自动装配对象。当通过杰克逊发送类B对象时,我只想发送类A的某些值,例如对象,而不是类A对象本身。

@Component
public class B {

    @Autowired
    @JsonIgnore
    private A instanceA;

    public String getValue() {
        return instanceA.getValue();
    }

    public void setValue(String value) {
        instanceA.setValue(value);
    }
}

我的Spring控制器看起来像这样。

@Controller
public class AppController {

    @RequestMapping(value = "/receive",
            consumes = { "application/json" },
            method = RequestMethod.POST)
    public void receiveB(@RequestBody B instanceB) {
        System.out.println("Value: " + instanceB.getValue());
    }
}

关于反序列化,Jackson当前正在尝试实例化没有Spring的对象。因此,类instanceA中的自动连接B为空,并且当Jackson尝试设置类B中的值时,它将给出以下响应消息(400):

JSON parse error: null; nested exception is com.fasterxml.jackson.databind.JsonMappingException: N/A\n at [Source: (PushbackInputStream); line: 2, column: 27] (through reference chain: B[\"value\"])

但是我希望Jackson从Spring获取一个类B bean,并将接收到的数据粘贴到其中。是否有任何反序列化设置或注释可实现这一目标?

1 个答案:

答案 0 :(得分:0)

  

我希望Jackson从Spring获得B类bean并将其粘贴   接收到的数据。

没有注释可以做到这一点。从技术上讲是可能的,但是需要一些努力。您可以实现自己的解串器并通过ObjectMapper注册。在此反序列化器中,您无需查找bean的新实例,而是查找Spring bean,然后“手动”设置其每个属性。

我不鼓励您反序列化为Spring bean。我建议您定义一些普通的Java bean(而不是Spring bean)并将其用于序列化/反序列化。您可以在Spring bean A和B中使用它来保持状态。这样会更容易。