Java JAXB使用名称空间从StringReader解组到xml
我有一个Java JAXB使用名称空间从StringReader解组到xml,java,xml,spring,jaxb,Java,Xml,Spring,Jaxb,我有一个ByteArrayInputStream形式的客户端响应,缓冲读取并创建一个StringReader来读取pojo表单中的xml。我想解组它,但我遇到了名称空间问题,因此出现了JAXBException 以下是我收到回复后的代码: public void post() { ... ByteArrayInputStream obj = (ByteArrayInputStream) response.getEntity(); Buffered
ByteArrayInputStream
形式的客户端响应,缓冲读取并创建一个StringReader来读取pojo表单中的xml。我想解组它,但我遇到了名称空间问题,因此出现了JAXBException
以下是我收到回复后的代码:
public void post() {
...
ByteArrayInputStream obj = (ByteArrayInputStream) response.getEntity();
BufferedReader br = new BufferedReader(new InputStreamReader(obj));
String line = null;
StringBuffer sb = new StringBuffer();
try{
while ((line = br.readLine()) != null){
System.out.println(line);
sb.append(line);
}
} catch (IOException e) {
e.printStackTrace();
}
JAXBContext jaxbContext = JAXBContext.newInstance(FileTransmissionResponse.class);
Unmarshaller unmarshaller = jaxbContext.createUnmarshaller();
StringReader reader = new StringReader(sb.toString());
FileTransmissionResponse transmissionResponse = (FileTransmissionResponse)
unmarshaller.unmarshal(reader);
}
StringBuffer
响应是以下字符串格式的xml:
<?xml version="1.0" encoding="UTF-8"?>
<fileTransmissionResponse xmlns="http://abc.xyz.com/schema/auditing/fileResponse-1.1">
<version>1.0</version>
<userId>xqas</userId>
<reNumber>1234</reNumber>
<reName>1234rfd</reName>
<status>FAILURE</status>
<fileName>file.xml</fileName>
<startTime>2021-04-06T09:16:54.065+10:00</startTime>
<finishTime>2021-04-06T09:16:54.743+10:00</finishTime>
<bytesTransferred>15530</bytesTransferred>
<emailSent>scd@xyz.com</emailSent>
....
</fileTransmissionResponse>
1
xqas
1234
1234rfd
失败
file.xml
2021-04-06T09:16:54.065+10:00
2021-04-06T09:16:54.743+10:00
15530
scd@xyz.com
....
波乔班
package com.example.response;
import javax.xml.bind.annotation.*;
import java.util.List;
@XmlRootElement(name = "fileTransmissionResponse")
@XmlType(propOrder = { "version", "userId", "reNumber", "reName", "status", "fileName", "startTime", "finishTime", "bytesTransferred", "totalRead", "totalTransferred", "totalIntercepted", "emailSent", "message"})
@XmlAccessorType(XmlAccessType.PROPERTY)
public class FileTransmissionResponse {
private String version;
private String userId;
private List<String> reNumber;
private List<String> reName;
private int status;
private List<String> fileName;
private String startTime;
private String finishTime;
private List<Integer> bytesTransferred;
private List<Integer> totalRead;
private List<Integer> totalTransferred;
private List<Integer> totalIntercepted;
private List<String> austracReference;
private List<String> emailSent;
private List<ErrorMessage> message;
public String getVersion() {
return version;
}
@XmlElement(name = "version")
public void setVersion(final String version) {
this.version = version;
}
public String getUserId() {
return userId;
}
@XmlElement(name = "userId")
public void setUserId(final String userId) {
this.userId = userId;
}
public List<String> getReNumber() {
return reNumber;
}
@XmlElement(name = "reNumber")
public void setReNumber(final List<String> reNumber) {
this.reNumber = reNumber;
}
public List<String> getReName() {
return reName;
}
@XmlElement(name = "reName")
public void setReName(final List<String> reName) {
this.reName = reName;
}
public int getStatus() {
return status;
}
@XmlElement(name = "status")
public void setStatus(final int status) {
this.status = status;
}
public List<String> getFileName() {
return fileName;
}
@XmlElement(name = "fileName")
public void setFileName(final List<String> fileName) {
this.fileName = fileName;
}
public String getStartTime() {
return startTime;
}
@XmlElement(name = "startTime")
public void setStartTime(final String startTime) {
this.startTime = startTime;
}
public String getFinishTime() {
return finishTime;
}
@XmlElement(name = "finishTime")
public void setFinishTime(final String finishTime) {
this.finishTime = finishTime;
}
public List<Integer> getBytesTransferred() {
return bytesTransferred;
}
@XmlElement(name = "bytesTransferred")
public void setBytesTransferred(final List<Integer> bytesTransferred) {
this.bytesTransferred = bytesTransferred;
}
public List<Integer> getTotalRead() {
return totalRead;
}
@XmlElement(name = "totalRead")
public void setTotalRead(final List<Integer> totalRead) {
this.totalRead = totalRead;
}
public List<Integer> getTotalTransferred() {
return totalTransferred;
}
@XmlElement(name = "totalTransferred")
public void setTotalTransferred(final List<Integer> totalTransferred) {
this.totalTransferred = totalTransferred;
}
public List<Integer> getTotalIntercepted() {
return totalIntercepted;
}
@XmlElement(name = "totalIntercepted")
public void setTotalIntercepted(final List<Integer> totalIntercepted) {
this.totalIntercepted = totalIntercepted;
}
public List<String> getEmailSent() {
return emailSent;
}
@XmlElement(name = "emailSent")
public void setEmailSent(final List<String> emailSent) {
this.emailSent = emailSent;
}
public List<ErrorMessage> getMessage() {
return message;
}
@XmlElement(name = "message")
public void setMessage(final List<ErrorMessage> message) {
this.message = message;
}
}
package com.example.response;
导入javax.xml.bind.annotation.*;
导入java.util.List;
@XmlRootElement(name=“fileTransmissionResponse”)
@XmlType(Propoder={“版本”、“用户ID”、“重新编号”、“重命名”、“状态”、“文件名”、“开始时间”、“完成时间”、“ByTestTransfered”、“totalRead”、“TotalTransfered”、“TotalIntercept”、“emailSent”、“message”})
@XmlAccessorType(XmlAccessType.PROPERTY)
公共类FileTransmissionResponse{
私有字符串版本;
私有字符串用户标识;
私人名单重新编号;
私有列表重命名;
私人身份;
私有列表文件名;
私有字符串开始时间;
私有字符串完成时间;
私有列表ByTestTransferred;
私有列表totalRead;
私人名单;
截获私人名单;
澳大利亚参考私人名单;
私人名单电邮;
私有列表消息;
公共字符串getVersion(){
返回版本;
}
@xmlement(name=“version”)
公共无效设置版本(最终字符串版本){
this.version=版本;
}
公共字符串getUserId(){
返回用户标识;
}
@xmlement(name=“userId”)
public void setUserId(最终字符串userId){
this.userId=userId;
}
公共列表getReNumber(){
返回重新编号;
}
@XmlElement(name=“重新编号”)
公共无效集合重新编号(最终列表重新编号){
this.reNumber=重新编号;
}
公共列表getReName(){
返回重命名;
}
@xmlement(name=“重命名”)
公共void setReName(最终列表重命名){
this.reName=重命名;
}
public int getStatus(){
返回状态;
}
@xmlement(name=“status”)
公共无效设置状态(最终int状态){
这个状态=状态;
}
公共列表getFileName(){
返回文件名;
}
@xmlement(name=“fileName”)
public void setFileName(最终列表文件名){
this.fileName=文件名;
}
公共字符串getStartTime(){
返回起始时间;
}
@xmlement(name=“startTime”)
公共无效设置开始时间(最终字符串开始时间){
this.startTime=startTime;
}
公共字符串getFinishTime(){
返回完成时间;
}
@xmlement(name=“finishTime”)
公共void setFinishTime(最终字符串finishTime){
this.finishTime=finishTime;
}
公共列表GetByTestTransferred(){
通过testtransferred返回;
}
@XmlElement(name=“ByTestTransferred”)
公共无效SetByteTransferred(最终列表ByTestTransferred){
this.ByTestTransferred=ByTestTransferred;
}
公共列表getTotalRead(){
返回totalRead;
}
@xmlement(name=“totalRead”)
公共无效setTotalRead(最终列表totalRead){
this.totalRead=totalRead;
}
公共列表getTotalTransferred(){
返回已转移的数据;
}
@XmlElement(name=“TotalTransfer”)
公共无效SetTotalTransfer(最终列表TotalTransfer){
this.totaltransfer=totaltransfer;
}
公共列表GetTotalIntercept(){
截获的返回总数;
}
@XmlElement(name=“totalIntercepted”)
已截获公共void setTotalIntercepted(最终列表totalIntercepted){
this.totalIntercepted=totalIntercepted;
}
公共列表getEmailSent(){
返回已发送的电子邮件;
}
@xmlement(name=“emailSent”)
public void setEmailSent(最终列表emailSent){
this.emailSent=emailSent;
}
公共列表getMessage(){
返回消息;
}
@xmlement(name=“message”)
公共无效设置消息(最终列表消息){
this.message=消息;
}
}
在解组调用之后,由于xmlns名称空间,我得到了一个JAXB异常。避免这种情况的方法有哪些?您应该使用
FileTransmissionResponse.java
类将package info.java
文件添加到包中,并定义xml模式
@XmlSchema(namespace = "http://abc.xyz.com/schema/auditing/fileResponse-1.1",
elementFormDefault = XmlNsForm.QUALIFIED)
package com.example.response;
import javax.xml.bind.annotation.XmlNsForm;
import javax.xml.bind.annotation.XmlSchema;
谢谢,这很有效。有没有其他替代方法?还有一个选项可以为
@XmlRootElement
和@XmlElement
定义名称空间参数,但我认为这是最方便的方法。