Jackson java.util.Optional Serialisierung nicht enthalten Typ ID
Habe ich die folgenden Klassen:
@JsonIdentityInfo(
generator = ObjectIdGenerators.IntSequenceGenerator.class,
property = "oid"
)
@JsonTypeInfo(
use = JsonTypeInfo.Id.NAME,
include = JsonTypeInfo.As.PROPERTY,
property = "clazz")
@JsonSubTypes({
@JsonSubTypes.Type(value = MySubEntity.class, name = "MySubEntity"),
})
public abstract class Entity {
...
}
public class MySubEntity extends Entity {
...
}
Wenn ich jetzt serialisieren, dass MySubEntity
eingewickelt in ein Optional
dann JSON enthält nicht die clazz
Attribut mit dem Typ ID. Bug? Wenn ich serialisieren zu List<MySubEntity>
oder einfach nur zu MySubEntity
es funktioniert gut.
Setup: jackson-databind-Methode 2.9.4, jackson-datatype-jdk8 2.9.4, Serialisierung geschieht in Spring-Boot-Anwendung, die Bereitstellung einer RESTful-web-service.
EDIT: Hier ist die Spring-REST-Methode, gibt die Optional
:
@RequestMapping(method = RequestMethod.GET, value = "/{uuid}", produces = "application/json")
public Optional<MySubEntity> findByUuid(@PathVariable("uuid") String uuid) {
...
}
EDIT:
Ich aus einem SSCCE mit einem einfachen Feder-REST-controller und zwei tests. Der erste test ist mit ObjectMapper
direkt die erfolgreich Deserialisierung obwohl die clazz
fehlt. Der zweite test ruft die REST-controller und bricht mit einer Fehlermeldung ab, weil clazz
fehlt:
Fehler beim extrahieren Antwort für " Typ [class com.Beispiel.demo.MySubEntity] und content-type [application/json;charset=UTF-8]; verschachtelte Ausnahme ist org.springframework.http.converter.HttpMessageNotReadableException: JSON parse error: Missing id-Typ, wenn Sie versuchen zu beheben Subtyp von [einfache Art, Klasse com.Beispiel.demo.MySubEntity]: fehlende Typ-id-Eigenschaft 'clazz'; verschachtelte Ausnahme ist com.fasterxml.jackson.databind-Methode.exc.InvalidTypeIdException: Fehlende Typ-id, wenn Sie versuchen zu beheben Subtyp von [einfache Art, Klasse com.Beispiel.demo.MySubEntity]: fehlende Typ-id-Eigenschaft 'clazz'
- Nur um zu klären, versuchen Sie zu Entität serialisieren zu JSON oder zu Deserialisieren es von JSON?
- Ich mache beides. Meine Frühlings-REST-webservice ist die Herstellung von JSON und meine client-Anwendung ist die Einnahme. Model-Klassen sind geteilt zwischen server und client.
- Verwenden Sie spring-boot? Versuchen Sie, entfernen die version von Abhängigkeit. Mit
spring-boot-starter-parent
als Elternteil oder als Stückliste in Ihrepom.xml
beheben sollten, die richtige version für Abhängigkeiten. Mit exakt dem gleichen controller, die Antwort, die ich bekommen hab ist{"clazz":"MySubEntity","oid":1}
. - Könnten Sie, bitte, poste die
json
Antwort, die Sie bekommen? - Ich fügte hinzu, ein SSCCE. Wenn Sie etwas Zeit haben, können Sie es versuchen. Rufen Sie einfach die test-Aufgabe von gradle bauen.
- Json-Antwort ist:
{"oid":1,"uuid":"1234","someProperty":"test"}
Du musst angemeldet sein, um einen Kommentar abzugeben.
Diese, in der Tat, sieht aus wie ein bug. Es gibt einen workaround, den ich vorschlagen kann, für diesen Fall ist die Verwendung
JsonTypeInfo.As.EXISTING_PROPERTY
und Feld hinzufügenclazz
zu IhremEntity
. Es gibt nur einen Fall, bei diesem Ansatz ist, dass dieclazz
muss festgelegt werden, in java-code manuell. Dies ist jedoch leicht zu überwinden.Hier ist der vollständige code für workaround:
jackson-datatype-jdk8
Projekt ist veraltet und zogjackson-modules-java8
. Aber mit dieser Abhängigkeit kann ich immer noch das Problem zu reproduzieren. So gehen Sie vor und öffnen Sie die Ausgabe! 🙂