Spring Json 反序列化为 Java 无效
Spring Json deserialization to Java doesn't work
我目前面临将 json 反序列化为多态类型的问题。
这是我的控制器,它接收 RecommendedVirtualEditionParam。
@RequestMapping(
value = "/sortedEdition",
method = RequestMethod.POST,
headers = { "Content-type=application/json;charset=UTF-8"
})
public String getSortedRecommendedVirtualEdition(
Model model,
@RequestBody RecommendVirtualEditionParam params) {
//Do Stuff
}
RecommendedVirtualEditionParam 是一个容器:
public class RecommendVirtualEditionParam {
private final String acronym;
private final String id;
private final Collection<Property> properties;
public RecommendVirtualEditionParam(
@JsonProperty("acronym") String acronym,
@JsonProperty("id") String id,
@JsonProperty("properties") Collection<Property> properties) {
this.acronym = acronym;
this.id = id;
this.properties = properties;
}
//Getters
}
属性 是一种多态类型,我相信这是给我带来问题的类型。
@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.PROPERTY, property = "type")
@JsonSubTypes({
@JsonSubTypes.Type(value = SpecificTaxonomyProperty.class, name = "specific-taxonomy")
})
public abstract class Property {
public Property() {
}
//Other methods
}
子类型:
public class SpecificTaxonomyProperty extends Property {
private final String acronym;
private final String taxonomy;
public SpecificTaxonomyProperty(
@JsonProperty("acronym") String acronym,
@JsonProperty("taxonomy") String taxonomy) {
this.acronym = acronym;
this.taxonomy = taxonomy;
}
正在根据请求发送 json:
{
acronym: "afs"
id: "167503724747"
properties: [
{
type: "specific-taxonomy",
acronym: "afs",
taxonomy: "afs"
}
]
}
当我 运行 这样时,我得到一个 org.springframework.web.HttpMediaTypeNotSupportedException:不支持内容类型 'application/json;charset=UTF-8'
org.springframework.web.HttpMediaTypeNotSupportedException: Content type 'application/json;charset=UTF-8' not supported
at org.springframework.web.servlet.mvc.method.annotation.AbstractMessageConverterMethodArgumentResolver.readWithMessageConverters(AbstractMessageConverterMethodArgumentResolver.java:149) ~[spring-webmvc-3.2.2.RELEASE.jar:3.2.2.RELEASE]
at org.springframework.web.servlet.mvc.method.annotation.RequestResponseBodyMethodProcessor.readWithMessageConverters(RequestResponseBodyMethodProcessor.java:180) ~[spring-webmvc-3.2.2.RELEASE.jar:3.2.2.RELEASE]
at org.springframework.web.servlet.mvc.method.annotation.RequestResponseBodyMethodProcessor.resolveArgument(RequestResponseBodyMethodProcessor.java:95) ~[spring-webmvc-3.2.2.RELEASE.jar:3.2.2.RELEASE]
我认为我设置 属性 class 的方式有问题,导致无法反序列化。任何人有线索并帮助我吗?
我设法解决了我的问题。
在发布之前,我环顾四周,很多答案都指向 class 我想反序列化同一属性的多个设置器。我没有太注意它,因为我的属性是最终的,我没有任何设置器。
但我有一个名为 setUserWeight(RecommendedWeights weights) 的方法,它没有设置 属性 的任何属性,但重命名后,我的问题得到解决。
我不太明白这种奇怪行为的原因,希望能对此有所了解。
我目前面临将 json 反序列化为多态类型的问题。
这是我的控制器,它接收 RecommendedVirtualEditionParam。
@RequestMapping(
value = "/sortedEdition",
method = RequestMethod.POST,
headers = { "Content-type=application/json;charset=UTF-8"
})
public String getSortedRecommendedVirtualEdition(
Model model,
@RequestBody RecommendVirtualEditionParam params) {
//Do Stuff
}
RecommendedVirtualEditionParam 是一个容器:
public class RecommendVirtualEditionParam {
private final String acronym;
private final String id;
private final Collection<Property> properties;
public RecommendVirtualEditionParam(
@JsonProperty("acronym") String acronym,
@JsonProperty("id") String id,
@JsonProperty("properties") Collection<Property> properties) {
this.acronym = acronym;
this.id = id;
this.properties = properties;
}
//Getters
}
属性 是一种多态类型,我相信这是给我带来问题的类型。
@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.PROPERTY, property = "type")
@JsonSubTypes({
@JsonSubTypes.Type(value = SpecificTaxonomyProperty.class, name = "specific-taxonomy")
})
public abstract class Property {
public Property() {
}
//Other methods
}
子类型:
public class SpecificTaxonomyProperty extends Property {
private final String acronym;
private final String taxonomy;
public SpecificTaxonomyProperty(
@JsonProperty("acronym") String acronym,
@JsonProperty("taxonomy") String taxonomy) {
this.acronym = acronym;
this.taxonomy = taxonomy;
}
正在根据请求发送 json:
{
acronym: "afs"
id: "167503724747"
properties: [
{
type: "specific-taxonomy",
acronym: "afs",
taxonomy: "afs"
}
]
}
当我 运行 这样时,我得到一个 org.springframework.web.HttpMediaTypeNotSupportedException:不支持内容类型 'application/json;charset=UTF-8'
org.springframework.web.HttpMediaTypeNotSupportedException: Content type 'application/json;charset=UTF-8' not supported
at org.springframework.web.servlet.mvc.method.annotation.AbstractMessageConverterMethodArgumentResolver.readWithMessageConverters(AbstractMessageConverterMethodArgumentResolver.java:149) ~[spring-webmvc-3.2.2.RELEASE.jar:3.2.2.RELEASE]
at org.springframework.web.servlet.mvc.method.annotation.RequestResponseBodyMethodProcessor.readWithMessageConverters(RequestResponseBodyMethodProcessor.java:180) ~[spring-webmvc-3.2.2.RELEASE.jar:3.2.2.RELEASE]
at org.springframework.web.servlet.mvc.method.annotation.RequestResponseBodyMethodProcessor.resolveArgument(RequestResponseBodyMethodProcessor.java:95) ~[spring-webmvc-3.2.2.RELEASE.jar:3.2.2.RELEASE]
我认为我设置 属性 class 的方式有问题,导致无法反序列化。任何人有线索并帮助我吗?
我设法解决了我的问题。
在发布之前,我环顾四周,很多答案都指向 class 我想反序列化同一属性的多个设置器。我没有太注意它,因为我的属性是最终的,我没有任何设置器。
但我有一个名为 setUserWeight(RecommendedWeights weights) 的方法,它没有设置 属性 的任何属性,但重命名后,我的问题得到解决。
我不太明白这种奇怪行为的原因,希望能对此有所了解。