Дата и «полиморфный» класс вызывают JsonGenerationException: BsonSerializer можно использовать только с BsonGenerator

При обновлении до jongo 1.3.0 мы начали получать следующую ошибку при чтении документов из MongoDB:

com.fasterxml.jackson.core.JsonGenerationException: BsonSerializer can only be used with BsonGenerator

После некоторого тестирования я обнаружил, что проблема возникает при использовании @JsonTypeInfo, а документ MongoDB содержит объект даты перед свойством типа. Данный:

@JsonTypeInfo(use = JsonTypeInfo.Id.NAME,
        include = JsonTypeInfo.As.EXISTING_PROPERTY,
        property = 'type',
        visible = true)
@JsonSubTypes([
        @JsonSubTypes.Type(name = 'a', value = A),
        @JsonSubTypes.Type(name = 'b', value = B)
])
abstract class Base {
    String string // For reference
    Date date
    String type
}

class A extends Base { A() { type = 'a' } }

class B extends Base { B() { type = 'b' } }

Этот (спок) тест провалится

def mapper = new ObjectMapper(new BsonFactory()).registerModule(new BsonModule())
def bytes = mapper.writeValueAsBytes(original)

expect:
def parsed = mapper.readValue(bytes, Base)
parsed instanceof A // com.fasterxml.jackson.core.JsonGenerationException: BsonSerializer can only be used with BsonGenerator
parsed.string == original.string
parsed.date == original.date // parsed.date is null with 'de.undercouch:bson4jackson:2.8.0-SNAPSHOT'
parsed.type == original.type

where:
testCase                  | original
'A'                       | new A(string: 'string', date: new Date(), type: 'a') // fails
'String, Date, Type'      | [string: 'string', date: new Date(), type: 'a']      // fails
'String, null date, Type' | [string: 'string', date: null, type: 'a']
'String, Type, Date'      | [string: 'string', type: 'a', date: new Date()]
'Type, String, Date'      | [type: 'a', string: 'string', date: new Date()]

Обратите внимание, что если date равно нулю или стоит после type, тест проходит успешно.

Я хотел бы обновить Jongo и Jackson, но не думаю, что смогу гарантировать порядок свойств в нашей БД. Вопрос в том, можно ли решить проблему.

  • Я пытался обновить Jackson до 2.8.6 и 2.8.7, но никакой разницы.
  • Когда я попробую de.undercouch:bson4jackson:2.8.0-SNAPSHOT, проанализированное date будет нулевым, если оно будет после type

Похоже, что похожая ошибка была решена в версии 2.8.0-SNAPSHOT: https://github.com/michel-kraemer/bson4jackson/issues/67

Я разместил здесь проблему: https://github.com/michel-kraemer/bson4jackson/issues/72


person Love    schedule 02.02.2017    source источник
comment
Вы нашли решение этой проблемы? Мы сталкиваемся с точно такой же проблемой, и использование de.undercouch:bson4jackson:2.8.0-SNAPSHOT не решает ее.   -  person user3495469    schedule 17.03.2017


Ответы (1)


Обеспечение порядка не обязательно, так как контент будет буферизоваться по мере необходимости. Однако это вызвало проблему, поскольку, хотя TokenBuffer реализует базовый JsonGenerator, он не реализует (и не может) реализовать специфичный для BSON подтип.

Но я думаю, что в дополнение к обновлению jackson-databind и jackson-core до 2.8.6 (что имеет смысл; исправление было в 2.8.3 или около того) вам также понадобится более новая версия bson4jackson. Однако похоже, что релиза 2.8 еще нет, только 2.7. Необходимо добавить примечание о проблеме, на которую вы ссылались, чтобы запросить выпуск.

person StaxMan    schedule 08.02.2017
comment
Я попробовал de.undercouch:bson4jackson:2.8.0-SNAPSHOT, но возникла новая проблема, обновил вопрос - person Love; 10.02.2017
comment
@ Люблю, ваш лучший выбор, вероятно, создать проблему для bson4jackson для оставшейся проблемы. - person StaxMan; 15.02.2017
comment
Да, я сделал это здесь. Спасибо за вашу помощь! - person Love; 15.02.2017