实体转XML时使用泛型报“nor any of its super class is known to this context.”

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>
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值