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