2010-07-21 6 views
5

Ich habe Schwierigkeiten, Jackson zu bekommen, json in ein Objekt zu deserialisieren, wenn man einen Dienst aufruft (speziell verwenden wir Jacksons Fähigkeit, JAXB-Annotationen zu verwenden, da wir auch den Dienst wollen benutze XML). Ich verwende Spring MVC und verwende die RestTemplate-Klasse, um Anrufe an den Dienst zu senden.Problem Deserialisieren mit Jackson mit JAXB-Annotationen im Frühjahr MVC

Hier ist, wo ich Setup die MappingJacksonHttpMessageConverter für meine junit:

ObjectMapper jsonMapper = new ObjectMapper(); 
AnnotationIntrospector introspector = new JaxbAnnotationIntrospector(); 
jsonMapper.getDeserializationConfig().setAnnotationIntrospector(introspector); 
jsonMapper.getSerializationConfig().setAnnotationIntrospector(introspector); 
jsonMapper.getSerializationConfig().setSerializationInclusion(Inclusion.NON_NULL); 
MappingJacksonHttpMessageConverter jacksonConverter = new MappingJacksonHttpMessageConverter(); 
jacksonConverter.setObjectMapper(jsonMapper); 
List<HttpMessageConverter<?>> converters = new ArrayList<HttpMessageConverter<?>>(); 
converters.add(jacksonConverter); 
template.setMessageConverters(converters); 

Und ich den Service rufen wie so:

HttpHeaders requestHeaders = new HttpHeaders(); 
requestHeaders.set("Accept", "application/json"); 
HttpEntity<String> requestEntity = new HttpEntity<String>(requestHeaders); 
ResponseEntity<NamedSystem> responseEntity = template.exchange(baseURL + "/{NamedSystemId}", 
     HttpMethod.GET, requestEntity, NamedSystem.class, orgId1); 

Meine NamedSystem Klasse ist wie so ein:

@XmlRootElement(name = "NamedSystem", namespace = "http://schemas.abc.workplace.com/NamedSystem") 
public class NamedSystem { 
    private String id; 
    private String name; 
    private String description; 
    private Set<NamedSystemAlias> aliases; 
    private String href; 

    @XmlAttribute(required = false, name = "id") 
    public String getId() { 
     return id; 
    } 


    public void setId(String id) { 
     this.id = id; 
    } 


    @XmlAttribute(required = false, name = "name") 
    public String getName() { 
     return name; 
    } 


    public void setName(String name) { 
     this.name = name; 
    } 


    @XmlAttribute(required = false, name = "description") 
    public String getDescription() { 
     return description; 
    } 


    public void setDescription(String description) { 
     this.description = description; 
    } 


    @XmlElementWrapper(required = false, name = "aliases", namespace = "http://schemas.abc.workplace.com/NamedSystem") 
    @XmlElement(required = false, name = "alias", namespace = "http://schemas.abc.workplace.com/NamedSystem") 
    public Set<NamedSystemAlias> getAliases() { 
     return aliases; 
    } 


    public void setAliases(Set<NamedSystemAlias> aliases) { 
     this.aliases = aliases; 
    } 

    @XmlAttribute(required = true, name = "href") 
    public String getHref() { 
     return href; 
    } 


    public void setHref(String href) { 
     this.href = href; 
    } 
} 

Dies ist der Fehler, der sich ergibt:

org.springframework.web.client.ResourceAccessException: I/O error: Unrecognized field "NamedSystem" (Class com.workplace.abc.named.NamedSystem), not marked as ignorable 
at [Source: [email protected]9c; line: 1, column: 2]; nested exception is org.codehaus.jackson.map.JsonMappingException: Unrecognized field "NamedSystem" (Class com.workplace.abc.named.NamedSystem), not marked as ignorable 
at [Source: [email protected]9c; line: 1, column: 2] 
at org.springframework.web.client.RestTemplate.doExecute(RestTemplate.java:453) 
.... 
Caused by: org.codehaus.jackson.map.JsonMappingException: Unrecognized field "NamedSystem" (Class com.workplace.abc.named.NamedSystem), not marked as ignorable 
at [Source: [email protected]9c; line: 1, column: 2] 
at org.codehaus.jackson.map.JsonMappingException.from(JsonMappingException.java:159) 
at org.codehaus.jackson.map.deser.StdDeserializationContext.unknownFieldException(StdDeserializationContext.java:247) 
at org.codehaus.jackson.map.deser.StdDeserializer.reportUnknownProperty(StdDeserializer.java:366) 
at org.codehaus.jackson.map.deser.StdDeserializer.handleUnknownProperty(StdDeserializer.java:352) 
at org.codehaus.jackson.map.deser.BeanDeserializer.handleUnknownProperty(BeanDeserializer.java:543) 
at org.codehaus.jackson.map.deser.BeanDeserializer.deserializeFromObject(BeanDeserializer.java:402) 
at org.codehaus.jackson.map.deser.BeanDeserializer.deserialize(BeanDeserializer.java:287) 
at org.codehaus.jackson.map.ObjectMapper._readMapAndClose(ObjectMapper.java:1588) 
at org.codehaus.jackson.map.ObjectMapper.readValue(ObjectMapper.java:1172) 
at org.springframework.http.converter.json.MappingJacksonHttpMessageConverter.readInternal(MappingJacksonHttpMessageConverter.java:132) 
at org.springframework.http.converter.AbstractHttpMessageConverter.read(AbstractHttpMessageConverter.java:154) 
at org.springframework.web.client.HttpMessageConverterExtractor.extractData(HttpMessageConverterExtractor.java:74) 
at org.springframework.web.client.RestTemplate$ResponseEntityResponseExtractor.extractData(RestTemplate.java:619) 
at org.springframework.web.client.RestTemplate$ResponseEntityResponseExtractor.extractData(RestTemplate.java:1) 
at org.springframework.web.client.RestTemplate.doExecute(RestTemplate.java:446) 
... 32 more 

Es scheint, dass das rootElement 'NamedSystem' nicht erkannt wird, um es zu deserialisieren. Wie würde ich es dazu bringen? Ich habe Beispiele gesehen, die dieselben JAXB-Annotationen verwenden, und sie funktionieren gut, so dass ich nicht sicher bin, was in meinem Fall anders ist oder wie ich es zwingen könnte, es korrekt zu deserialisieren. Wenn jemand Hilfe anbieten kann, würde ich es begrüßen.

+0

Ich sollte beachten, ich habe auch versucht, den Konverter sehr einfach hinzufügen, wie: converters.add (new MappingJacksonHttpMessageConverter()); und bekomme das gleiche Ergebnis (ich denke, die Art, wie ich es in der Post eingerichtet habe, ist unnötig, aber nicht schädlich). Aufgrund einiger Debugging bin ich fast 100% sicher, dass es nicht die Serialisierung ist. Ich muss nur einen Weg finden, um den JSON-Parser dazu zu bringen, NamedSystem zu erkennen. – AHungerArtist

+0

Das Problem könnte auch gelöst werden, wenn ich den NamedSystem-Teil des JSON loswerden könnte. – AHungerArtist

Antwort