Ich habe das folgende Objektmodell in meinem Spring MVC (v3.2.0.RELEASE) Web-Anwendung:De-Serialisierung JSON zu polymorphen Objektmodell mit Spring und JsonTypeInfo Anmerkung
public class Order {
private Payment payment;
}
@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = As.WRAPPER_OBJECT)
@JsonSubTypes.Type(name = "creditCardPayment", value = CreditCardPayment.class)
public interface Payment {}
@JsonTypeName("creditCardPayment")
public class CreditCardPayment implements Payment {}
Wenn ich die Order-Klasse serialise zu JSON, erhalte ich folgendes Ergebnis (das ist genau das, was ich will):
{
"payment" : {
"creditCardPayment": {
...
}
}
Leider, wenn ich die oben JSON nehmen und versuchen, es zu de-serialise zurück in mein Objektmodell, erhalte ich die folgende Ausnahme:
Could not read JSON: Could not resolve type id 'creditCardPayment' into a subtype of [simple type, class Payment] at [Source: [email protected]; line: 1, column: 58] (through reference chain: Order["payment"]); nested exception is com.fasterxml.jackson.databind.JsonMappingException: Could not resolve type id 'creditCardPayment' into a subtype of [simple type, class Payment] at [Source: [email protected]; line: 1, column: 58] (through reference chain: Order["payment"])
ist meine Anwendung über Feder JavaConf konfiguriert wie folgt:
@Configuration
@EnableWebMvc
public class AppWebConf extends WebMvcConfigurerAdapter {
@Bean
public ObjectMapper objectMapper() {
ObjectMapper objectMapper = new ObjectMapper();
objectMapper.setSerializationInclusion(Include.NON_NULL);
objectMapper.configure(MapperFeature.DEFAULT_VIEW_INCLUSION, false);
return objectMapper;
}
@Bean
public MappingJackson2HttpMessageConverter mappingJacksonMessageConverter() {
MappingJackson2HttpMessageConverter converter = new MappingJackson2HttpMessageConverter();
converter.setObjectMapper(objectMapper());
return converter;
}
@Bean
public Jaxb2RootElementHttpMessageConverter jaxbMessageConverter() {
return new Jaxb2RootElementHttpMessageConverter();
}
@Override
public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
converters.add(jaxbMessageConverter());
converters.add(mappingJacksonMessageConverter());
}
}
Zum Testen habe ich einen Controller mit 2 Methoden, eine Bestellung liefert für HTTP-GET-Anforderung (dieses arbeitet) und eine, akzeptiert einen Auftrag über einen HTTP-POST (dieser schlägt fehl), z
@Controller
public class TestController {
@ResponseBody
@RequestMapping(value = "/test", method = RequestMethod.GET)
public Order getTest() {}
@RequestMapping(value = "/test", method = RequestMethod.POST)
public void postTest(@RequestBody order) {}
}
Ich habe alle Vorschläge aus den verschiedenen Diskussionen anprobiert SO, aber bisher kein Glück gehabt. Kann jemand sehen, was ich falsch mache?
SomeClass2.class zu konvertieren, die gearbeitet ! Ich habe '@ JsonSubTypes.Type (name =" creditCardPayment ", Wert = CreditCardPayment.class)' von der Schnittstelle "Payment" entfernt und "objectMapper.registerSubtypes (CreditCardPayment.class);" in der Klasse "AppWebConf" hinzugefügt. Es ist enttäuschend, dass Annotationen nicht funktionierten, da ich meine Konfiguration generisch halten wollte, aber es bringt mich zumindest über dieses Problem hinaus. Vielen Dank. – grigori
Ich hatte das gleiche Problem, und die obige Lösung hilft nicht. –