gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 12:05:04 24 4
gpt4 key购买 nike

我的目标是在我们的全局事件代理和 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com