【发布时间】:2013-10-14 21:16:54
【问题描述】:
我的 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:无法解析类型 id 'creditCardPayment' 在 [Source: org.apache.catalina.connector.CoyoteInputStream@19629355;线:1, 列:58](通过引用链:Order["payment"]);嵌套的 例外是 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 种方法,一个返回一个用于 HTTP GET 请求的订单(这个有效),一个通过 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 的各种讨论中的所有建议,但到目前为止都没有运气。谁能发现我做错了什么?
【问题讨论】: