首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么jaxb不将这个XML文档解编组成Java对象?

为什么jaxb不将这个XML文档解编组成Java对象?
EN

Stack Overflow用户
提问于 2021-01-05 21:09:04
回答 1查看 861关注 0票数 1

谢谢你抽出时间阅读。

在询问之前,我想指出,我已经在StackOverflow /互联网上阅读了尽可能多的类似文章。

我的目标是将响应从API请求反序列化为可用的java对象。

我正在向端点发送一个POST请求,以便在我们的计划中创建一个作业。成功地创建了作业,并在正文中返回了以下XML:

代码语言:javascript
复制
<entry xmlns="http://purl.org/atom/ns#">
    <id>0</id>
    <title>Job has been created.</title>
    <source>com.tidalsoft.framework.rpc.Result</source>
    <tes:result xmlns:tes="http://www.auto-schedule.com/client">
        <tes:message>Job has been created.</tes:message>
        <tes:objectid>42320</tes:objectid>
        <tes:id>0</tes:id>
        <tes:operation>CREATE</tes:operation>
        <tes:ok>true</tes:ok>
        <tes:objectname>Job</tes:objectname>
    </tes:result>
</entry>

但是,当我试图将其解封为POJO时,映射并不像预期的那样工作。

为了简单起见,我只尝试捕获第一个字段:idtitlesource (我尝试只捕获一个字段-- id --并且我还尝试执行allE 210字段,但没有结果)。

下面是POJO的样子:

代码语言:javascript
复制
@XmlRootElement(name = "entry", namespace = "http://purl.org/atom/ns#")
@XmlAccessorType(XmlAccessType.FIELD)
public class Response {

    @XmlElement(name = "id")
    private String id;

    @XmlElement(name = "title")
    private String title;

    @XmlElement(name = "source")
    private String source;

    public Response() {}
}

为了检查是否捕获了Xml元素,我正在记录属性,这些属性为null:

代码语言:javascript
复制
Response{id='null', title='null', source='null'}

冒充是发送请求的HTTP客户端,下面是客户机文件:

代码语言:javascript
复制
@FeignClient(name="ReportSchedulerClient", url = "https://scheduler.com", configuration = FeignClientConfiguration.class)
public interface ReportSchedulerClient {

    @PostMapping(value = "/webservice", consumes = "application/xml", produces = "text/xml")
    Response sendJobConfigRequest(@RequestBody Request request);

}

和一个用于auth的简单自定义配置文件:

代码语言:javascript
复制
public class FeignClientConfiguration {
    @Bean
    public BasicAuthRequestInterceptor basicAuthRequestInterceptor() {
        return new BasicAuthRequestInterceptor("user", "pass");
    }
}

我试图避免显式地解除文件的编组,但我也尝试使用以下内容显式地解除请求:

代码语言:javascript
复制
Response response = (Response) unmarshaller.unmarshal(new StreamSource(new StringReader(response.body().toString())));

如果您有任何建议,如果我的代码有什么问题,或者其他建议,请告诉我。提前谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-01-05 22:28:18

您需要在元素级别指定namespace。例如:

代码语言:javascript
复制
@XmlElement(name = "id", namespace = "http://purl.org/atom/ns#")
private String id;

若要设置默认命名空间,可以在包级别进行设置,在package文件夹中创建Packageinfo.java文件,其内容如下:

代码语言:javascript
复制
@XmlSchema(
    namespace = "http://purl.org/atom/ns#",
    elementFormDefault = XmlNsForm.QUALIFIED)
package your.model.package;

import javax.xml.bind.annotation.XmlNsForm;
import javax.xml.bind.annotation.XmlSchema;

此外,在向所有字段显式添加@XmlElement时,可以删除@XmlAccessorType(XmlAccessType.FIELD)注释,因为它的目的是在默认情况下将所有字段映射到元素。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65586599

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档