Как остановить @JsonProperty, вызывающий использование сериализатора родительского класса? - PullRequest
1 голос
/ 06 июня 2019

Я обновляю jackson-databind с версии 2.9.0 до 2.9.8 и столкнулся с проблемой, из-за которой значение @JsonProperty заставляет пружину отобразить значение @JsonSerialize из родительского метода с тем же именем.

Пример подкласса:

public class SubClassEntity extends AbstractEntity {

    @JsonView(SubClassEntity.class)
    @JsonProperty("user")
    @JsonSerialize(using = UserSubClassEntitySerialzer.class)
    public Entity getSubClassUser() {
        return super.getEntity();
    }

    @JsonView(SubClassEntity.class)
    @JsonProperty("userAlternative")
    public UserEntity getSubClassUserAlternative() {
        final User user = super.getUserAlternative();
        return null != user ? new UserEntity(user) : null;
    }
}

Пример родительского класса

public class AbstractEntity {

        protected final Entity entity;

    public AbstractEntity (final Entity entity) {
        this.entity = entity;
    }

    public Entity getEntity() {
        return this.entity;
    }

    @JsonView(Object.class)
    @JsonSerialize(using = UserInfoSerializer.class)
    public User getUser() {
        return this.entity.getUser();
    }

    @JsonView(Object.class)
    @JsonSerialize(using = UserInfoSerializer.class)
    public User getUserAlternative() {
        return this.entity.getUserAlternative();
    }
}

UserSubClassEntitySerialzer

public class UserSubClassEntitySerialzer extends JsonSerializer<Entity> {

does stuff

}

UserInfoSerializer

public class UserInfoSerializer extends JsonSerializer<User> {

does stuff

}

Когда мы пытаемся сериализовать подкласс, набор JsonSerializer для родительского класса имени, найденного в JsonProperty, используется независимо от того, установлен ли он в подклассе.Это вызывает ClassCastException:

com.fasterxml.jackson.databind.JsonMappingException: package.UserEntity cannot be cast to package.User(through reference chain: package.SubClassEntity["userAlternative"])

и

com.fasterxml.jackson.databind.JsonMappingException: package.Entity cannot be cast to package.User(through reference chain: package.SubClassEntity["user"])
    at com.fasterxml.jackson.databind.JsonMappingException.wrapWithPath(JsonMappingException.java:394)
    at com.fasterxml.jackson.databind.JsonMappingException.wrapWithPath(JsonMappingException.java:353)
    at com.fasterxml.jackson.databind.ser.std.StdSerializer.wrapAndThrow(StdSerializer.java:316)
    at com.fasterxml.jackson.databind.ser.std.BeanSerializerBase.serializeFields(BeanSerializerBase.java:727)
    at com.fasterxml.jackson.databind.ser.BeanSerializer.serialize(BeanSerializer.java:155)
    at com.fasterxml.jackson.databind.ser.DefaultSerializerProvider._serialize(DefaultSerializerProvider.java:480)
    at com.fasterxml.jackson.databind.ser.DefaultSerializerProvider.serializeValue(DefaultSerializerProvider.java:319)
    at com.fasterxml.jackson.databind.ObjectWriter$Prefetch.serialize(ObjectWriter.java:1396)
    at com.fasterxml.jackson.databind.ObjectWriter._configAndWriteValue(ObjectWriter.java:1120)
    at com.fasterxml.jackson.databind.ObjectWriter.writeValueAsString(ObjectWriter.java:993)

Есть ли способ для подкласса игнорировать значение JsonProperty при определении сериализатора?

...