java 在 Spring MVC 中使用 JAXB 注释与 Jackson 进行反序列化的问题

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/3300144/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-10-30 01:11:36  来源:igfitidea点击:

Problem Deserializing with Hymanson using JAXB annotations in Spring MVC

javaspring-mvcjaxbserializationHymanson

提问by AHungerArtist

I'm having trouble getting Hymanson to correctly deserialize json into an object when calling a service (specifically we're using Hymanson's ability to use JAXB annotations since we also want the service to use XML). I'm using Spring MVC and I'm using the RestTemplate class to make calls to the service.

在调用服务时,我无法让 Hymanson 正确地将 json 反序列化为一个对象(特别是我们使用 Hymanson 使用 JAXB 注释的能力,因为我们也希望该服务使用 XML)。我正在使用 Spring MVC 并且我正在使用 RestTemplate 类来调用服务。

Here is where I setup the MappingHymansonHttpMessageConverter for my junit:

这是我为我的 junit 设置 MappingHymansonHttpMessageConverter 的地方:

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

And I call the service like 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);

My NamedSystemclass is set up like so:

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

This is the error that results:

这是导致的错误:

org.springframework.web.client.ResourceAccessException: I/O error: Unrecognized field "NamedSystem" (Class com.workplace.abc.named.NamedSystem), not marked as ignorable
 at [Source: sun.net.www.protocol.http.HttpURLConnection$HttpInputStream@c1429c; line: 1, column: 2]; nested exception is org.codehaus.Hymanson.map.JsonMappingException: Unrecognized field "NamedSystem" (Class com.workplace.abc.named.NamedSystem), not marked as ignorable
 at [Source: sun.net.www.protocol.http.HttpURLConnection$HttpInputStream@c1429c; line: 1, column: 2]
 at org.springframework.web.client.RestTemplate.doExecute(RestTemplate.java:453)
....
Caused by: org.codehaus.Hymanson.map.JsonMappingException: Unrecognized field "NamedSystem" (Class com.workplace.abc.named.NamedSystem), not marked as ignorable
 at [Source: sun.net.www.protocol.http.HttpURLConnection$HttpInputStream@c1429c; line: 1, column: 2]
 at org.codehaus.Hymanson.map.JsonMappingException.from(JsonMappingException.java:159)
 at org.codehaus.Hymanson.map.deser.StdDeserializationContext.unknownFieldException(StdDeserializationContext.java:247)
 at org.codehaus.Hymanson.map.deser.StdDeserializer.reportUnknownProperty(StdDeserializer.java:366)
 at org.codehaus.Hymanson.map.deser.StdDeserializer.handleUnknownProperty(StdDeserializer.java:352)
 at org.codehaus.Hymanson.map.deser.BeanDeserializer.handleUnknownProperty(BeanDeserializer.java:543)
 at org.codehaus.Hymanson.map.deser.BeanDeserializer.deserializeFromObject(BeanDeserializer.java:402)
 at org.codehaus.Hymanson.map.deser.BeanDeserializer.deserialize(BeanDeserializer.java:287)
 at org.codehaus.Hymanson.map.ObjectMapper._readMapAndClose(ObjectMapper.java:1588)
 at org.codehaus.Hymanson.map.ObjectMapper.readValue(ObjectMapper.java:1172)
 at org.springframework.http.converter.json.MappingHymansonHttpMessageConverter.readInternal(MappingHymansonHttpMessageConverter.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

It seems it doesn't recognize the rootElement 'NamedSystem' to be able to deserialize. How would I get it to do that? I've seen examples that use the same JAXB annotations and they work fine so I'm not sure what's different about my case or how I might force it to correctly deserialize it. If anyone can offer any help, I'd appreciate it.

它似乎无法识别能够反序列化的 rootElement 'NamedSystem'。我将如何让它做到这一点?我见过使用相同 JAXB 注释的示例,它们工作正常,所以我不确定我的案例有什么不同,或者我如何强制它正确反序列化它。如果有人可以提供任何帮助,我将不胜感激。

采纳答案by AHungerArtist

If anyone comes along this kind of problem, this might fix it for you: Enable Hymanson to not output the class name when serializing (using Spring MVC)

如果有人遇到这种问题,这可能会为您解决:Enable Hymanson to not output the class name when serializing (using Spring MVC)

See my answer and follow the link for an example.

请参阅我的回答并按照链接查看示例。