【问题标题】:How to inject beans when Jackson deserializes a JSON request?Jackson反序列化JSON请求时如何注入bean?
【发布时间】:2019-10-04 15:20:43
【问题描述】:

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

我的代码如下所示:

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

@Component
public class A {

    private String value;

    @Autowired
    private Obj autowiredObj;

    // getter & setter
}

另一个类B 有几个类似于类A 的自动装配对象。当通过 Jackson 发送 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 的情况下实例化一个对象。因此B 类中的自动连线instanceA 为空,当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 并将接收到的数据粘贴到其中。是否有任何反序列化设置或注释来实现这一点?

【问题讨论】:

    标签: spring spring-mvc jackson


    【解决方案1】:

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

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

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

    【讨论】:

    • ATM 似乎除了“手动”之外别无他法。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-04
    • 1970-01-01
    • 2015-03-19
    • 1970-01-01
    • 2018-01-31
    • 2015-02-28
    • 1970-01-01
    相关资源
    最近更新 更多