java - ObjectMapper 必须使用 JSON 文件未提供的参数调用构造函数

标签 java jackson jackson-databind

我的目标是在我们的全局事件代理和 Spring 的 ApplicationEvent 系统之间编写某种桥梁。

消息代理以 JSON 格式提供消息。我的想法是有一个

public class ExternalApplicationEvent extends ApplicationEvent {
   ...
   // e.g @JsonPropert private String name;
}

然后调用类似的东西

objectMapper.readValue(brokerMessage, ExternalApplicationEvent.class);

问题是,ApplicationEvent 需要一个源 在构建时设置,它应该是 ExternalEventBridge 的实例,它是由于显而易见的原因,不是 JSON 文档的一部分。

我发现,如何向 JSON 添加属性,这些属性不是使用 @JsonAppend 的序列化对象的一部分,但我还没有找到适合我方向的解决方案,将参数传递给类的构造函数。

我最后的想法是使用

objectMapper.readerForUpdating(new ExternalApplicationEvent(theSource)).readValue(message)

但不知何故这并没有填满我的 Activity 。

如果我添加构造函数

public ExternalApplicationEvent() {
  super(new Object());
}

并使用 objectMapper.readValue(message, ExternalApplicationEvent.class),通过字段注入(inject)正确填充对象。此外,添加二传手也无济于事。

最佳答案

我现在解决了这个问题,方法是像这样从 ApplicationEvent 中分离数据:

@JsonIgnoreProperties(ignoreUnknown = true)
@JsonAutoDetect(getterVisibility = JsonAutoDetect.Visibility.NONE) // Don't detect `getSource` from ApplicationEvent
public class ExternalApplicationEvent extends ApplicationEvent {

    // I might use @JsonUnwrapped probably, but since I have to create setters
    // and getters anyway...
    private ExternalApplicationEventData p = new ExternalApplicationEventData();

    public ExternalApplicationEvent(Object source, ExternalApplicationEventData data) {
        super(source);
        p = data;
    }

    @JsonGetter("name")
    public String getName() { return p.name; }

    public void setName(String name) { p.name = name; }

    public static class ExternalApplicationEventData {

        @JsonCreator
        private ExternalApplicationEventData() {} // Make creation only possible by parsing or from the ExternalApplicationEvent class

        @JsonProperty
        private String name;

        ...
    }
}

然后创建事件

var data = objectMapper.readValue(message, ExternalApplicationEvent.ExternalApplicationEventData.class);
var event = new ExternalApplicationEvent(this, data);

关于java - ObjectMapper 必须使用 JSON 文件未提供的参数调用构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56639850/

相关文章:

java - Jackson JSON - 解码时出现 "no single-String constructor/factory method"错误

java - 为什么ObjectNode在Json字符串中添加反斜杠

java - Jackson Enum 格式,适用于您不拥有的格式

apache-spark - Spark 作业在 jackson 依赖项上失败

java - Braintree Drop-In UI 不显示 CVV 字段

java - Java 中用于排除超过 2 "=="的模式的正则表达式

java - 更新 Spring Boot Parent 后的 PortUnreachableExceptions 垃圾邮件日志

java - 将 XML 字符串转换为 Java 对象 Jackson/JAXB

java - 如何将实体对象绑定(bind)到本地 @Transient 属性?

java - 使用 Bouncy CaSTLe 重建私钥和公钥?