Я обновляю 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 при определении сериализатора?