2017-02-02 23 views
0

При обновлении Джонго 1.3.0 мы начали, чтобы получить следующее сообщение об ошибке при чтении документов из MongoDB:Дата и «полиморфный» класс вызывает JsonGenerationException: BsonSerializer могут быть использованы только с BsonGenerator

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

После некоторого тестирования I что проблема возникает при использовании @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' } } 

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

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

+0

Вы нашли решение этой проблемы? Мы сталкиваемся с одной и той же проблемой и используем de.undercouch: bson4jackson: 2.8.0-SNAPSHOT не решает проблему. – user3495469

ответ

0

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

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

+0

Я попробовал 'de.undercouch: bson4jackson: 2.8.0-SNAPSHOT', но получил новую проблему, обновил вопрос – Love

+0

@Love лучший выбор - вероятно, проблема с файлом' bson4jackson' для остающейся проблемы. – StaxMan

+0

Да, я сделал это [здесь] (https://github.com/michel-kraemer/bson4jackson/issues/72). Спасибо за вашу помощь! – Love