为什么 jaxb 不将此 XML 文档解组为 Java 对象?
Why is jaxb not unmarshalling this XML document into a Java object?
感谢您抽空阅读。
在提问之前,我想指出我已经在 Whosebug/互联网上阅读了尽可能多的类似帖子。
我的目标是将 API 请求的响应反序列化为可用的 java 对象。
我正在向端点发送 POST 请求以在我们的日程安排中创建作业。 job创建成功,body中返回如下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 - 我也尝试过 all字段无效)。
这是 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())));
如果您有任何建议、我的代码有任何问题或任何其他建议,请告诉我。提前致谢。
您需要在元素级别指定 namespace
。
例如:
@XmlElement(name = "id", namespace = "http://purl.org/atom/ns#")
private String id;
要设置默认命名空间,您可以在包级别进行,在包文件夹中创建 package-info.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;
此外,由于您明确将 @XmlElement
添加到所有字段,因此您可以删除 @XmlAccessorType(XmlAccessType.FIELD)
注释,因为它的目的是默认将所有字段映射到元素。
感谢您抽空阅读。
在提问之前,我想指出我已经在 Whosebug/互联网上阅读了尽可能多的类似帖子。
我的目标是将 API 请求的响应反序列化为可用的 java 对象。
我正在向端点发送 POST 请求以在我们的日程安排中创建作业。 job创建成功,body中返回如下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 - 我也尝试过 all字段无效)。
这是 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())));
如果您有任何建议、我的代码有任何问题或任何其他建议,请告诉我。提前致谢。
您需要在元素级别指定 namespace
。
例如:
@XmlElement(name = "id", namespace = "http://purl.org/atom/ns#")
private String id;
要设置默认命名空间,您可以在包级别进行,在包文件夹中创建 package-info.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;
此外,由于您明确将 @XmlElement
添加到所有字段,因此您可以删除 @XmlAccessorType(XmlAccessType.FIELD)
注释,因为它的目的是默认将所有字段映射到元素。