在 jackson mixins 中同时使用 @JsonIgnore 和 @JsonProperty 的问题

Issue with using both @JsonIgnore and @JsonProperty in jackson mixins

我有一个在 jackson mixin 中同时使用 @JsonIgnore@JsonProperty 的用例。

这是我的混音:

public abstract class MessageMixin {
    @JsonIgnore
    Member sender;

    @JsonIgnore
    Member recipient;

    @JsonProperty("senderId")
    Long getSenderId() {
        return sender.getId();
    }

    @JsonProperty("recipientId")
    Long getRecipientId() {
        return recipient.getId();
    }

    @JsonProperty("senderFirstName")
    String getSenderFirstName() {
        return sender.getFirstName();
    }

    @JsonProperty("recipientFirstName")
    String getRecipientFirstName() {
        return recipient.getFirstName();
    }
}

senderrecipient 字段被正确忽略,但添加了 @JsonProperty 字段的 none。

有人可以帮忙吗?

Mix-ins 可用于将 Jackson 配置应用于 classes 而无需修改目标 class 的源代码。 Mix-ins 可以被认为是位于 class 之上的配置层,Jackson 将在 de/serialization 期间查看指令。 Mix-ins 的一个好处是它们将 Jackson 特定的配置与您的项目代码分离,使您可以摆脱 Jackson 并使用新框架而无需修改所有 VO。话虽这么说,为了实例化的目的扩展一个混入是很奇怪的。我认为您会希望在混合中避免像 sender.getFirstName() 这样的逻辑,并允许基数 class 填充值。例如,对于您提供的混入,我希望基础 class 具有 public senderrecipient 成员,并且您的混入完全是抽象的。

如果Message是一个已经存在的class

假设基数 class 是这样的:

public class Message {
    public Member sender;
    public Member recipient;

    public Message(Member sender, Member recipient) {
        this.sender = sender;
        this.recipient = recipient;
    }

    public Long getSenderId() {
        return sender.getId();
    }

    public Long getRecipientId() {
        return recipient.getId();
    }

    public String getSenderFirstName() {
        return sender.getFirstName();
    }

    public String getRecipientFirstName() {
        return recipient.getFirstName();
    }
}

如果没有混合,这个 class 会产生:

{
    "sender": {
        "id": 883,
        "firstName": "Bob"
    },
    "recipient": {
        "id": 3993,
        "firstName": "Jilly"
    },
    "senderId": 883, 
    "recipientId": 3993, 
    "senderFirstName": "Bob", 
    "recipientFirstName": "Jilly"
}

要引入混入并忽略 senderrecipient 而不修改 Message,必须使用 ObjectMapper.[=27 注册混入=]

混音可能如下所示:

public abstract class MessageMixin {
    @JsonIgnore
    Member sender;

    @JsonIgnore
    Member recipient;

    @JsonProperty("senderId")
    abstract Long getSenderId();

    @JsonProperty("recipientId")
    abstract Long getRecipientId();

    @JsonProperty("senderFirstName")
    abstract String getSenderFirstName();

    @JsonProperty("recipientFirstName")
    abstract String getRecipientFirstName();
}

ObjectMapper 配置如下:

ObjectMapper om = new ObjectMapper()
        .addMixIn(Message.class, MessageMixin.class);

它会输出以下内容 JSON:

{
    "senderId": 883,
    "senderFirstName": "Bob",
    "recipientFirstName": "Jilly",
    "recipientId": 3993
}

如果Message不存在

如果 Message 基础 class 不存在,那么您最好创建一个简单的 POJO 来完成 "Message" 表示。像这样的东西可以很好地处理序列化和反序列化。

public class MessagePojo {
    private final Member sender;
    private final Member recipient;

    @JsonCreator
    public MessagePojo(@JsonProperty("sender") Member sender,
                       @JsonProperty("recipient") Member recipient) {
        this.sender = sender;
        this.recipient = recipient;
    }

    @JsonProperty("senderId")
    public Long getSenderId() {
        return sender.getId();
    }

    @JsonProperty("recipientId")
    public Long getRecipientId() {
        return recipient.getId();
    }

    @JsonProperty("senderFirstName")
    public String getSenderFirstName() {
        return sender.getFirstName();
    }

    @JsonProperty("recipientFirstName")
    public String getRecipientFirstName() {
        return recipient.getFirstName();
    }
}