Spring Boot中实体转成XMl时使用泛型报
nor any of its super class is known to this context.
报错信息:
avax.xml.bind.MarshalException
- with linked exception:
[com.sun.istack.SAXException2: class com.landicorp.entity.patrent.search.PatrentInData nor any of its super class is known to this context.
javax.xml.bind.JAXBException: class com.landicorp.entity.patrent.search.PatrentInData nor any of its super class is known to this context.]
at com.sun.xml.bind.v2.runtime.MarshallerImpl.write(MarshallerImpl.java:318)
at com.sun.xml.bind.v2.runtime.MarshallerImpl.marshal(MarshallerImpl.java:244)
at javax.xml.bind.helpers.AbstractMarshallerImpl.marshal(AbstractMarshallerImpl.java:116)
at com.landicorp.utils.XMLUtil.convertToXml(XMLUtil.java:33)
at com.landicorp.jkk.mapper.JkkTrace.getPatientInXml(JkkTrace.java:193)
at com.landicorp.jkk.mapper.JkkTrace.main(JkkTrace.java:34)
1. 测试转换:
PatrentInData build = PatrentInData.builder().hosCardNo("D0E4CA3A19564067A8D80EFEC865D2140EE17AB65104E6BB5E4603A06D4D49D1:1").hosCardType("01").build();
RequestHead requestHead = RequestHead.builder().busCode("1002").terminalNo("0000006").operNo("ghzz002").tradeTime("213152").tradeDate("20200805").build();
BaseInxml<PatrentInData> baseInxml = new BaseInxml<>();
baseInxml.setData(build);
baseInxml.setRequestHead(requestHead);
log.info("baseInXml:{}",baseInxml);
System.out.println(XMLUtil.convertToXml(baseInxml));
3. 泛型实体
@Data
@Builder
@NoArgsConstructor
@XmlAccessorType(XmlAccessType.FIELD)
@XmlRootElement(name = "request")
@XmlSeeAlso({Patient.class}) //使用泛型需要在这定义运行时类
public class BaseInxml<T> {
private T data;
private RequestHead requestHead;
public BaseInxml(T data, RequestHead requestHead){
this.data = data;
this.requestHead = requestHead;
}
}
3. 工具类的转换方法
public static String convertToXml(Object obj) {
// 创建输出流
StringWriter sw = new StringWriter();
try {
// 利用jdk中自带的转换类实现
JAXBContext context = JAXBContext.newInstance(obj.getClass());
Marshaller marshaller = context.createMarshaller();
// 格式化xml输出的格式
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE);
// 将对象转换成输出流形式的xml
marshaller.marshal(obj, sw);
}catch (MarshalException e1){
log.error("error1:{}",e1.getMessage());
e1.printStackTrace();
} catch (JAXBException e) {
log.error("error:{}",e.getMessage());
e.printStackTrace();
}
return sw.toString();
}
解决:
使用泛型的时候需要在泛型实体中的@XmlSeeAlso注册中声明运行时类 @XmlSeeAlso({Patient.class,PatrentInData.class})
@Data
@Builder
@NoArgsConstructor
@XmlAccessorType(XmlAccessType.FIELD)
@XmlRootElement(name = "request")
@XmlSeeAlso({Patient.class,PatrentInData.class}) //使用泛型需要在这定义运行时类
public class BaseInxml<T> {
private T data;
private RequestHead requestHead;
public BaseInxml(T data, RequestHead requestHead){
this.data = data;
this.requestHead = requestHead;
}
}
运行结果:
<request>
<data xsi:type="patrentInData" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<hosCardType>01</hosCardType>
<hosCardNo>D0E4CA3A19564067A8D80EFEC865D2140EE17AB65104E6BB5E4603A06D4D49D1:1</hosCardNo>
</data>
<requestHead>
<busCode>1002</busCode>
<operNo>ghzz002</operNo>
<terminalNo>0000006</terminalNo>
<tradeDate>20200810</tradeDate>
<tradeTime>171445</tradeTime>
</requestHead>
</request>