2010-07-21 41 views
5

我遇到了麻煩傑克遜調用服務(特別是當我們使用傑克遜的使用JAXB標註的能力,因爲我們也希望該服務能正確反序列化JSON成一個反序列化對象使用XML)。我使用的是Spring MVC,我使用RestTemplate類來調用服務。問題用傑克遜JAXB註釋在Spring MVC

這裏是我設置的MappingJacksonHttpMessageConverter我的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); 

我呼籲,像這樣的服務:

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

NamedSystem類設置像這樣:

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

這是導致錯誤:

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 

它似乎無法識別能夠反序列化的rootElement'NamedSystem'。我如何才能做到這一點?我看過使用相同JAXB註釋的例子,它們工作正常,所以我不確定我的情況有什麼不同,或者我可能會強制它正確地反序列化它。如果任何人都可以提供任何幫助,我會很感激。

+0

我要指出,我也嘗試添加該轉換器非常簡單,如:converters.add(新MappingJacksonHttpMessageConverter());並得到相同的結果(我認爲我在帖子中設置的方式是不必要的,但不是有害的)。由於一些調試,我幾乎100%相信它不是序列化。這只是我需要找到一種方式來獲得的JSON解析器識別NamedSystem – AHungerArtist 2010-07-21 17:26:36

+0

的問題也可能會,如果我能夠擺脫的JSON NamedSystem部分以及解決.. – AHungerArtist 2010-07-21 18:55:11

回答