Date和'polymorphic'类导致JsonGenerationException:BsonSerializer只能与BsonGenerator一起使用

时间:2017-02-02 14:08:14

标签: java mongodb jackson bson jongo

当更新到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' } }

此(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,但不认为我可以保证属性的顺序 在我们的DB上。问题是问题是否可以解决。

  • 我尝试将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

1 个答案:

答案 0 :(得分:0)

确保订购不必要,因为内容将根据需要进行缓冲。但是,这确实会引发问题,因为TokenBuffer实现基JsonGenerator时,它不会(也不能)实现特定于BSON的子类型。

但我认为除了将jackson-databindjackson-core升级到2.8.6(这是有道理的;修复版是在2.8.3左右)之外,您还需要更新版本的{{ 1}}。然而它看起来还没有发布2.8,只有2.7。 需要在您提到的问题上添加注释,要求发布。