当前位置: 首页 > 知识库问答 >
问题:

为什么jaxb没有将这个XML文档解组为Java对象?

丌官承
2023-03-14

感谢您抽出时间阅读。

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

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

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

<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中时,映射没有按预期工作。

为了简单起见,我试图只捕获第一个字段,id,title和source(我试图只捕获一个字段——id——并且我还尝试了所有字段,但没有成功)。

以下是POJO的外观:

@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元素,我记录了属性,这些属性为空:

Response{id='null', title='null', source='null'}

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

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

}

和一个用于身份验证的简单自定义配置文件:

public class FeignClientConfiguration {
    @Bean
    public BasicAuthRequestInterceptor basicAuthRequestInterceptor() {
        return new BasicAuthRequestInterceptor("user", "pass");
    }
}

我试图避免显式取消编组文件,但我也尝试使用如下内容显式解组请求:

Response response = (Response) unmarshaller.unmarshal(new StreamSource(new StringReader(response.body().toString())));

如果您有任何建议,如果我的代码有任何问题,或任何替代建议,请告诉我。提前谢谢。

共有1个答案

夏侯兴怀
2023-03-14

您需要在元素级别指定命名空间。例如:

@XmlElement(name = "id", namespace = "http://purl.org/atom/ns#")
private String id;

要设置默认名称空间,可以在包级别创建包信息。包文件夹中的java文件,内容如下:

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

此外,当您显式地将< code>@XmlElement添加到所有字段中时,您可以移除< code > @ XmlAccessorType(XmlAccessType。FIELD)注释,因为它的目的是在默认情况下将所有字段映射到元素

 类似资料:
  • 我试图将我下面的xml转换为java对象。 这是我的xml: 我需要在"提供者组织"下获取"name"的值。下面是我Java课。 诊所ocument.java 记录目标。JAVA 病人ole.java 供应商组织。JAVA XMLFileParserSAXUtility.java 我得到的结果是 如果我尝试打印syso(临床文件); 结果是临床文档[recordTarget=null] 请帮帮我!

  • 我遵循这个教程: https://www.w3schools.com/php/php_xml_dom.asp 循环遍历XML部分是有问题的。出于某种原因,PHP将DOM对象视为数组。此外,var_dump除了长度之外,不返回任何关于对象属性的信息,但程序输出看起来像是不知从何而来。foreach可以通过某种方式循环对象吗?如果有,这些属性(节点名和节点值)包含在哪里,因为var_dump没有显示它

  • 问题内容: 有一个丑陋的XML文件必须解组: 产生的Java对象应为: 这个问题的答案非常接近,但我不知道最终的解决方案。 问题答案: 怎么样? 介绍一个称为选项的通用超类: 然后在带有选项列表的类(在本示例中为Configuration)上,在该属性上指定一个@XmlJavaTypeAdapter: XmlAdapter看起来像这样: AdaptedOptions看起来像:

  • 我尝试了一切,但图像不会显示出来,我试图使图像变小但没有用,我试图改变路径,我试图改变图像的位置但没有帮助,我试图在互联网上搜索但一无所获。 我看到的只是空白的图形用户界面,没有文本和图像。如果你能帮我,你会帮我一个大忙。 代码如下:

  • 在Java API中,它声明公共StringBuilder类扩展Object,但实际上,OpenJDK声明它扩展包私有AbstractStringBuilder类。问题:为什么Java API不能声明它扩展了AbstractStringBuilder? OpenJDK-公共最终类StringBuffer扩展AbstractStringBuilder实现java.io.Serializable,Ch

  • 问题内容: 当我运行此代码时: 我懂了 哪个是正确的,所以我的问题是为什么它将雇员改为雇员?是否可以用大写E代替雇员打印? 这是我真正想要的: 谢谢! 问题答案: 您看到的行为是标准 JAXB(JSR-222) XML名称到Java名称转换算法的结果。 您可以使用注释指定名称: 我是 EclipseLink JAXB(MOXy)的 负责人,并且我们有一个扩展名,它使您可以覆盖您可能感兴趣的默认名称