我有一个POJO,用于映射从Rabbitmq接收到的值。邮件是从我无法控制的其他第三方服务发送的。问题是这些服务不能以一致的方式发送某些字段。
例如,在error
字段的情况下,仅当第三方服务要发送消息以通知存在错误时,此字段才会具有信息。某些服务可能以这种方式将其JSON消息发送到队列:
{
id: 123,
name: "PersonA",
error: null
}
然后还有一些服务可以通过这种方式发送其JSON消息:
{
id: 123,
name: "PersonA",
error: []
}
还有一些服务可能会完全忽略该字段:
{
id: 123,
name: "PersonA"
}
当然,如果有错误,该错误字段将包含其中的字段:
{
id: 123,
name: "PersonA",
error: {
message: "Cannot find PersonA"
}
}
因此,错误字段可能是null
,undefined
,array
或object
。问题是,我只能在POJO中为error
字段定义单个类型。
public class MyMessage {
private int id;
private MessageError error;
private String name;
@JsonCreator
public MyMessage(
@JsonProperty("id") int id,
@JsonProperty("error") MessageError error, // error is a MessageError object already but what is sent in could be null, undefined, an array or an object
@JsonProperty("name") String name
) {
this.id = id;
this.error = error;
this.name = name;
}
}
public class MessageError {
private String message;
@JsonCreator
public MessageError(
@JsonProperty("message") String message
) {
this.message = message;
}
}
我与杰克逊一起使用Spring。在这种情况下,如何对反序列化消息中的error
字段分配的所有可能值并将其映射到POJO?
[如果您在json数据中没有任何标记来标识其来源并由此标识其形状,我将尝试将错误字段类型设置为object,如果它不起作用或不适合,则将其设置为“ json raw”,例如在How can I include raw JSON in an object using Jackson?的答案中进行了解释因此,您可以根据在运行时发现的内容,以适当的方式处理错误字段,并从上面详细介绍的预期内容中进行窥探。