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

为什么jaxb不将这个XML文档解组为Java对象?,java,xmlhttprequest,jaxb,xml-deserialization,feign,Java,Xmlhttprequest,Jaxb,Xml Deserialization,Feign,感谢您抽出时间阅读 在提问之前,我想指出,我已经在StackOverflow/互联网上尽可能多地阅读了类似的帖子 我的目标是将API请求的响应反序列化为可用的java对象 我正在向端点发送POST请求,以便在计划中创建作业。已成功创建作业,并在正文中返回以下XML: <entry xmlns="http://purl.org/atom/ns#"> <id>0</id> <title>Job has been cr

感谢您抽出时间阅读

在提问之前,我想指出,我已经在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>
为了检查是否捕获了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())));
@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(name = "id", namespace = "http://purl.org/atom/ns#")
private String id;
要设置默认名称空间,可以在包级别进行设置,在包文件夹中创建package-info.java文件,内容如下:

Response response = (Response) unmarshaller.unmarshal(new StreamSource(new StringReader(response.body().toString())));
@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;

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

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

@XmlElement(name = "id", namespace = "http://purl.org/atom/ns#")
private String id;
要设置默认名称空间,可以在包级别进行设置,在包文件夹中创建package-info.java文件,内容如下:

Response response = (Response) unmarshaller.unmarshal(new StreamSource(new StringReader(response.body().toString())));
@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;

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

移动
名称空间=”http://purl.org/atom/ns#"
从根元素注释到三个
@xmlement
注释中的每一个:
@xmlement(name=“id”,namespace=”http://purl.org/atom/ns#)
。或者创建一个package-info.java文件,如本问题所示:。@andrewjames谢谢您的建议。添加包信息文件能够解决我的问题。@andrewjames如果您能查看以下问题,将不胜感激:Move
namespace=”http://purl.org/atom/ns#“
从根元素注释到三个
@xmlement
注释中的每一个:
@xmlement(name=“id”,命名空间="http://purl.org/atom/ns#")
。或者创建一个package-info.java文件,如问题所示:。@andrewjames感谢您的建议。添加package-info文件能够解决我的问题。@andrewjames如果您能查看以下问题,我将不胜感激:添加package-info文件对我非常有效,现在数据已被删除ing按预期成功打包到java对象中。我真是太感谢你了!@Areuswill如果你能检查这个后续问题,我会非常感激:添加包信息文件对我来说非常有效,现在数据正按预期成功打包到java对象中。我真是太感谢你了!@Areuswill如果您可以查看此后续问题,请联系: