У меня была похожая проблема с тем же исключением, но принятый ответ не помог мне в моем случае. Вот решение, которое сработало для меня:
В моей настройке я использовал пользовательский JacksonSerializer, как это:
@JsonSerialize(using = MyCustomSerializer.class)
private Object someAttribute;
И этот сериализатор был реализован так:
public class MyCustomSerializer extends JsonSerializer<Object> {
@Override
public void serialize(Object o, JsonGenerator jgen, SerializerProvider provider) throws IOException, JsonProcessingException {
if (o != null) {
jgen.writeObject(o);
}
}
}
Проблема в том, что, пока вы не используете фильтры, все работает. Это также работает, если вы сериализуете примитивы, например, если вы используете jgen.writeString(..)
. Если вы используете фильтры, этот код неверен, потому что фильтры хранятся где-то внутри SerializerProvider
, а не в JsonGenerator
. Если в этом случае вы используете jsongenerator напрямую, новый SerializerProvider, который не знает о фильтрах, создается внутри. Поэтому вместо короткого jgen.writeObject(o)
вам нужно позвонить provider.defaultSerializeValue(o, jgen)
. Это гарантирует, что фильтры не будут потеряны и могут быть применены.