简体   繁体   中英

Spring Json deserialization to Java doesn't work

I currently facing an issue with the deserialization of json into an polymorphic type.

This is my controller which receives a 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 is a container:

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
}

Property is a polymorphic type and I believe it's the one giving my problems.

@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
}

The sub type:

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;
}

The json being send on requests:

{
    acronym: "afs"
    id: "167503724747"
    properties: [
        {
            type: "specific-taxonomy", 
            acronym: "afs", 
            taxonomy: "afs"
        }
    ]
}

When I run it like this I get a org.springframework.web.HttpMediaTypeNotSupportedException: Content type 'application/json;charset=UTF-8' not supported

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]

I believe there is something wrong with with the way I setup my Property class that makes it unable to deserialize. Any has a clue and give me an hand?

I managed to fix my problem.

Before posting, I had looked around and a lot of answers pointed to the class I wanted to deserialize having multiple setters for the same attribute. I didn't pay much attention to it, since my attributes were final, I didn't have any setters for them.

https://stackoverflow.com/a/19444874/2364671

But I had a method called setUserWeight(RecommendedWeights weights) which didn't set any attributes of Property, but after renaming it, my problem was fixed.

I don't quiet understand the reason for this odd behavior and would love some light about it.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM