FasterXML / FasterXML/jackson-dataformats-binary

Ion Polymorphic deserialization in 2.12 breaks wrt use of Native Type Ids when upgrading from 2.8

Ouverte
#270 1 commentaire 0 réactions 0 personnes assignées Voir sur GitHub
ion
Langage dominant
Java
Étoiles
347
Forks
156
Merge moyen
3 j 3 h
PR mergées (30 j)
22

Description

Given the following classes:

```
@JsonTypeInfo(
use = JsonTypeInfo.Id.NAME,
include = JsonTypeInfo.As.PROPERTY,
property = "base",
visible = true
)
@JsonSubTypes({
@Type(value = Subclass.class, name = "subclass"),
})
static public class BaseClass {
}

public static class Subclass extends BaseClass {
public String base;
}

public static class Container {
public BaseClass objectWithType;
}
```

The following ion can be deserialized using Jackson-dataformat-ion 2.8:

```
{
objectWithType:type::{
base: "subclass"
name: "Some name"
}
}
```

### Current Behavior
When using Jackson-dataformat-ion 2.12.x, the following exception is thrown:
```
com.fasterxml.jackson.databind.exc.InvalidTypeIdException:
Could not resolve type id 'type' as a subtype of `com.fasterxml.jackson.dataformat.ion.polymorphism.PolymorphicTypeAnnotationsTest$BaseClass`: known type ids = [PolymorphicTypeAnnotationsTest$BaseClass, subtype] (for POJO property 'objectWithType')
```

This happens because [IonParser.canReadTypeId()](https://github.com/FasterXML/jackson-dataformats-binary/blob/master/ion/src/main/java/com/fasterxml/jackson/dataformat/ion/IonParser.java#L156) always returns true, it makes [Jackson-databind](https://github.com/FasterXML/jackson-databind/blob/df8d7a15a0c0d94a57c35ac31aacef5ed10de58a/src/main/java/com/fasterxml/jackson/databind/jsontype/impl/AsPropertyTypeDeserializer.java#L68) incorrectly read the [field name token](https://amzn.github.io/ion-docs/docs/spec.html#struct) `type::` as a *native type id*.

### Expected Behavior
There should not be an exception. This could be accomplished by allowing the check for *native type ids* to be disabled in the `IonParser` while deserializing, similar to what was added in the `IonGenerator` in #232 during serialization.

Then, the IonMapper could be configured with the following:
```
IonObjectMapper ionMapper = new IonValueMapper();
ionMapper.disable(IonParser.Feature.USE_NATIVE_TYPE_ID)
```
**Note**: disabling **`IonGenerator`**`.Feature.USE_NATIVE_TYPE_ID` (which is already available) doesn't do the trick here.

Guide de contribution

Aucun guide de contribution indexé pour ce dépôt

Évaluation

Cette issue n'a pas encore été évaluée.

Recevez les nouvelles issues par e-mail

Un résumé court des issues GitHub adaptées aux débutants.