Spring MVC (v3.2.0.RELEASE) Web アプリケーションに次のオブジェクト モデルがあります。
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 {}
Order クラスを JSON にシリアル化すると、次の結果が得られます (まさにこれが必要です)。
{
"payment" : {
"creditCardPayment": {
...
}
}
残念ながら、上記の JSON を逆シリアル化してオブジェクト モデルに戻そうとすると、次の例外が発生します。
JSON を読み取れませんでした: [ソース: org.apache.catalina.connector.CoyoteInputStream@19629355; 行: 1、列: 58] (参照チェーン経由: 注文["支払い"]); ネストされた例外は com.fasterxml.jackson.databind.JsonMappingException です: タイプ ID 'creditCardPayment' を [単純なタイプ、クラス支払い] のサブタイプに解決できませんでした [ソース: org.apache.catalina.connector.CoyoteInputStream@19629355; 行: 1、列: 58] (参照チェーン経由: Order["payment"])
私のアプリケーションは、Spring JavaConf を介して次のように構成されています。
@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());
}
}
テスト用に、2 つのメソッドを持つコントローラーがあります。1 つは HTTP GET 要求の Order を返し (これは機能します)、もう 1 つは HTTP POST を介して注文を受け入れる (これは失敗します)。
@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) {}
}
SOに関するさまざまな議論からのすべての提案を試しましたが、これまでのところうまくいきませんでした。誰かが私が間違っていることを見つけることができますか?