Java JAXB unmarshal赢得';不能使用JDK1.6
是的,这是一个很长很无聊的问题,同时可能很简单( 我只是从Java调用了一个用.NET平台实现的SOAP Web服务接口。在接收到数据后,使用JAXB将其转换为Java对象。JDK1.8一切正常,但JDK1.6失败 我注意到解组过程在GetBjxsDataResponse级别停止,也就是说,我可以从信封体成功获取GetBjxsDataResponse的实例,但是该实例的getBjxsDataResult成员为null 这与JAXB RI版本有关吗?我是java世界的新手。需要您的帮助!:) NamespaceMapper.java Envelope.java EnveloperHeader.java EnvelopeBody.java GetBjxsDataResponse.javaJava JAXB unmarshal赢得';不能使用JDK1.6,java,xml,jaxb,jdk1.6,Java,Xml,Jaxb,Jdk1.6,是的,这是一个很长很无聊的问题,同时可能很简单( 我只是从Java调用了一个用.NET平台实现的SOAP Web服务接口。在接收到数据后,使用JAXB将其转换为Java对象。JDK1.8一切正常,但JDK1.6失败 我注意到解组过程在GetBjxsDataResponse级别停止,也就是说,我可以从信封体成功获取GetBjxsDataResponse的实例,但是该实例的getBjxsDataResult成员为null 这与JAXB RI版本有关吗?我是java世界的新手。需要您的帮助!:) Na
import java.util.List;
导入javax.xml.bind.annotation.XmlAccessType;
导入javax.xml.bind.annotation.XmlAccessorType;
导入javax.xml.bind.annotation.xmlement;
导入javax.xml.bind.annotation.XmlRootElement;
@XmlRootElement(name=“GetBjxsDataResponse”,namespace=NamespaceMapper.WS_URI)
@XmlAccessorType(XmlAccessType.FIELD)
公共类GetBjxsDataResponse扩展了ResponseCommon{
@XmlAccessorType(XmlAccessType.FIELD)
私有静态类GetBjxsDataResult{
@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
私有静态类Diffgram{
@XmlAccessorType(XmlAccessType.FIELD)
私有静态类NewDataSet{
@xmlement(name=“Table”)
私人名单;
}
@XmlElement(name=“NewDataSet”)
私有NewDataSet NewDataSet;
};
@XmlElement
私有对象模式;
@XmlElement
私有Diffgram-Diffgram;
};
@xmlement(name=“GetBjxsDataResult”)
私有GetBjxsDataResult GetBjxsDataResult;
@凌驾
公共对象getValuableData(){
返回getBjxsDataResult.diffgram.newDataSet.lists;
}
}
MainTest.java
import java.io.ByteArrayInputStream;
导入java.io.InputStream;
导入java.util.List;
导入javax.xml.bind.JAXBContext;
导入javax.xml.bind.JAXBException;
导入javax.xml.bind.Unmarshaller;
公共类测试{
公共静态void main(字符串[]args)抛出JAXBEException{
System.out.println(“--”);
字符串str=“”
+“\n”
+“\n”
+“\n”
+“\n”
+“\n”
+“\n”
+“\n”
+“\n”
+“\n”
+“\n”
+“\n”
+“\n”
+“\n”
+“\n”
+“\n”
+“\n”
+“\n”
+“\n”
+“\n”
+“\n”
+“\n”
+“\n”
+“\n”
+“\n”
+“\n”
+“\n”
+“320130001\n”
+“3101\n”
+“1\n”
+ "陈馨儿 \n“
+ "高一(01)班 \n“
+“\n”
+“\n”
+“320130002\n”
+“3101\n”
+“2\n”
+ "丁灵 \n“
+ "高一(01)班 \n“
+“\n”
+“\n”
+“320130003\n”
+“3101\n”
+“3\n”
+ "童欣欣 \n“
+ "高一(01)班 \n“
+“\n”
+“\n”
+“\n”
+“\n”
+“\n”
+“\n”
+“\n”;
系统输出打印项次(str);
JAXBContext jaxbContext2=JAXBContext.newInstance(
Envelope.class,GetBjxsDataResponse.class);
InputStream is=newbytearrayinputstream(str.getBytes());
Unmarshaller Unmarshaller=jaxbContext2.createUnmarshaller();
信封响应开发=(信封)解组器。解组器(is);
GetBjxsDataResponse GetBjxsDataResponse=
(GetBjxsDataResponse)responseEnvelope.getBody().getMethod();
@抑制警告(“未选中”)
List bjxsDatas=(List)getBjxsDataResponse.getValuableData();
System.out.println(bjxsDatas.size());
}
}
最后,我选择通过解析XML格式响应,并通过将结果转换为Java对象实例
import com.sun.xml.internal.bind.marshaller.NamespacePrefixMapper;
public class NamespaceMapper extends NamespacePrefixMapper {
private static final String SOAP_PREFIX = "x";
public static final String SOAP_URI = "http://schemas.xmlsoap.org/soap/envelope/";
private static final String WS_PREFIX = "tem";
public static final String WS_URI = "http://tempuri.org/";
public static final String XMLSchema_URI = "http://www.w3.org/2001/XMLSchema";
public static final String DIFFGR_URI = "urn:schemas-microsoft-com:xml-diffgram-v1";
@Override
public String getPreferredPrefix(String arg0, String arg1, boolean arg2) {
if (SOAP_URI.equals(arg0))
return SOAP_PREFIX;
else if (WS_URI.equals(arg0))
return WS_PREFIX;
return arg1;
}
}
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
@XmlRootElement(name = "Envelope", namespace = NamespaceMapper.SOAP_URI)
@XmlAccessorType(XmlAccessType.FIELD)
public class Envelope {
@XmlElement(name = "Header", namespace = NamespaceMapper.SOAP_URI, required = false)
private EnvelopeHeader header;
@XmlElement(name = "Body", namespace = NamespaceMapper.SOAP_URI)
private EnvelopeBody body;
public EnvelopeHeader getHeader() {
return header;
}
public void setHeader(EnvelopeHeader header) {
this.header = header;
}
public EnvelopeBody getBody() {
return body;
}
public void setBody(EnvelopeBody body) {
this.body = body;
}
}
import javax.xml.bind.annotation.XmlRootElement;
@XmlRootElement(namespace = NamespaceMapper.SOAP_URI)
public class EnvelopeHeader {
}
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlAnyElement;
import javax.xml.bind.annotation.XmlRootElement;
@XmlAccessorType(XmlAccessType.FIELD)
@XmlRootElement(namespace = NamespaceMapper.SOAP_URI)
public class EnvelopeBody {
@XmlAnyElement(lax = true)
private Object method;
public Object getMethod() {
return method;
}
public void setMethod(Object method) {
this.method = method;
}
}
import java.util.List;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
@XmlRootElement(name = "GetBjxsDataResponse", namespace = NamespaceMapper.WS_URI)
@XmlAccessorType(XmlAccessType.FIELD)
public class GetBjxsDataResponse extends ResponseCommon {
@XmlAccessorType(XmlAccessType.FIELD)
private static class GetBjxsDataResult {
@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
private static class Diffgram {
@XmlAccessorType(XmlAccessType.FIELD)
private static class NewDataSet {
@XmlElement(name = "Table")
private List<Object> lists;
}
@XmlElement(name = "NewDataSet")
private NewDataSet newDataSet;
};
@XmlElement
private Object schema;
@XmlElement
private Diffgram diffgram;
};
@XmlElement(name="GetBjxsDataResult")
private GetBjxsDataResult getBjxsDataResult;
@Override
public Object getValuableData() {
return getBjxsDataResult.diffgram.newDataSet.lists;
}
}
import javax.xml.bind.annotation.XmlTransient;
public abstract class ResponseCommon {
@XmlTransient
private String errorMessage;
public String getErrorMessage() {
return errorMessage;
}
public void setErrorMessage(String errorMessage) {
this.errorMessage = errorMessage;
}
public abstract Object getValuableData();
}
import java.util.List;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
@XmlRootElement(name = "GetBjxsDataResponse", namespace = NamespaceMapper.WS_URI)
@XmlAccessorType(XmlAccessType.FIELD)
public class GetBjxsDataResponse extends ResponseCommon {
@XmlAccessorType(XmlAccessType.FIELD)
private static class GetBjxsDataResult {
@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
private static class Diffgram {
@XmlAccessorType(XmlAccessType.FIELD)
private static class NewDataSet {
@XmlElement(name = "Table")
private List<Object> lists;
}
@XmlElement(name = "NewDataSet")
private NewDataSet newDataSet;
};
@XmlElement
private Object schema;
@XmlElement
private Diffgram diffgram;
};
@XmlElement(name="GetBjxsDataResult")
private GetBjxsDataResult getBjxsDataResult;
@Override
public Object getValuableData() {
return getBjxsDataResult.diffgram.newDataSet.lists;
}
}
import java.io.ByteArrayInputStream;
import java.io.InputStream;
import java.util.List;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Unmarshaller;
public class MainTest {
public static void main(String[] args) throws JAXBException {
System.out.println("---");
String str = "<?xml version=\"1.0\" encoding=\"utf-8\"?>"
+ "<soap:Envelope xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" \n"
+ "xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\"> \n"
+ "<soap:Body> \n"
+ "<GetBjxsDataResponse xmlns=\"http://tempuri.org/\"> \n"
+ "<GetBjxsDataResult> \n"
+ "<xs:schema id=\"NewDataSet\" xmlns=\"\" xmlns:xs=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\"> \n"
+ "<xs:element name=\"NewDataSet\" msdata:IsDataSet=\"true\" msdata:MainDataTable=\"Table\" msdata:UseCurrentLocale=\"true\"> \n"
+ "<xs:complexType> \n"
+ "<xs:choice minOccurs=\"0\" maxOccurs=\"unbounded\"> \n"
+ "<xs:element name=\"Table\"> \n"
+ "<xs:complexType> \n"
+ "<xs:sequence> \n"
+ "<xs:element name=\"xh\" type=\"xs:string\" minOccurs=\"0\" /> \n"
+ "<xs:element name=\"bjbh\" type=\"xs:string\" minOccurs=\"0\" /> \n"
+ "<xs:element name=\"bnbh\" type=\"xs:int\" minOccurs=\"0\" /> \n"
+ "<xs:element name=\"xm\" type=\"xs:string\" minOccurs=\"0\" /> \n"
+ "<xs:element name=\"bjmc\" type=\"xs:string\" minOccurs=\"0\" /> \n"
+ "</xs:sequence> \n"
+ "</xs:complexType> \n"
+ "</xs:element> \n"
+ "</xs:choice> \n"
+ "</xs:complexType> \n"
+ "</xs:element> \n"
+ "</xs:schema> \n"
+ "<diffgr:diffgram xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\" xmlns:diffgr=\"urn:schemas-microsoft-com:xml-diffgram-v1\"> \n"
+ "<NewDataSet xmlns=\"\"> \n"
+ "<Table diffgr:id=\"Table1\" msdata:rowOrder=\"0\"> \n"
+ "<xh>320130001</xh> \n"
+ "<bjbh>3101</bjbh> \n"
+ "<bnbh>1</bnbh> \n"
+ "<xm>陈馨儿</xm> \n"
+ "<bjmc>高一(01)班 </bjmc> \n"
+ "</Table> \n"
+ "<Table diffgr:id=\"Table2\" msdata:rowOrder=\"1\"> \n"
+ "<xh>320130002</xh> \n"
+ "<bjbh>3101</bjbh> \n"
+ "<bnbh>2</bnbh> \n"
+ "<xm>丁灵</xm> \n"
+ "<bjmc>高一(01)班 </bjmc> \n"
+ "</Table> \n"
+ "<Table diffgr:id=\"Table3\" msdata:rowOrder=\"2\"> \n"
+ "<xh>320130003</xh> \n"
+ "<bjbh>3101</bjbh> \n"
+ "<bnbh>3</bnbh> \n"
+ "<xm>童欣欣</xm> \n"
+ "<bjmc>高一(01)班 </bjmc> \n"
+ "</Table> \n"
+ "</NewDataSet> \n"
+ "</diffgr:diffgram> \n"
+ "</GetBjxsDataResult> \n"
+ "</GetBjxsDataResponse> \n"
+ "</soap:Body> \n"
+ "</soap:Envelope> \n";
System.out.println(str);
JAXBContext jaxbContext2 =JAXBContext.newInstance(
Envelope.class, GetBjxsDataResponse.class);
InputStream is = new ByteArrayInputStream(str.getBytes());
Unmarshaller unmarshaller = jaxbContext2.createUnmarshaller();
Envelope responseEnvelope = (Envelope)unmarshaller.unmarshal(is);
GetBjxsDataResponse getBjxsDataResponse =
(GetBjxsDataResponse)responseEnvelope.getBody().getMethod();
@SuppressWarnings("unchecked")
List<Object> bjxsDatas = (List<Object>)getBjxsDataResponse.getValuableData();
System.out.println(bjxsDatas.size());
}
}