Xstream报文解析与组装

1.maven引入

<dependency>
    <groupId>com.thoughtworks.xstream</groupId>
    <artifactId>xstream</artifactId>
    <version>1.4.18</version>
</dependency>

2.对象与XML互相转化工具

public class XmlUtils {

    /**
     * 对象转换为xml字符串
     *
     * @param obj
     * @return
     */
    public static String toXml(Object obj) throws Exception{
        XStream xstream = new XStream(new DomDriver("GBK"));
        //自动识别注解
        xstream.autodetectAnnotations(true);
        //转换出来的xml文件都会加上class="实际类型"属性,如:<Body class="xxx">,class并不是我们想要的。去除class属性。
        xstream.aliasSystemAttribute(null, "class");
        String xmlStr="";
        try{
            xmlStr=xstream.toXML(obj);
        }catch(Exception e){
            throw new Exception("对象转化为xml异常");
        }
        //空格与换行符替换
        Pattern p = Pattern.compile("\\s{2,}|\t|\r|\n");
        Matcher m = p.matcher(xmlStr);
        //增加xml报文前缀
        String finalresult = Constants.XML_PREX+ m.replaceAll("");
        return finalresult;
    }

    /**
     * xml转换为对象
     *
     * @param xml
     * @param type
     * @return
     */
    public static <T> T toObject(String xml, Class<T> type)throws Exception{
        XStream xstream = new XStream();
        T result = null;
        try{
            //转化为固定类型
            xstream.processAnnotations(type);
            //忽略未知元素
            xstream.ignoreUnknownElements();
            //转化为对象
            Object obj = xstream.fromXML(xml);
            result=type.cast(obj);
        }catch(Exception e){
            throw new Exception("xml转化为对象异常");
        }

        return result;
    }

}

public class Constants {
      /*
     * xml文件前缀
     */
    public final static String XML_PREX="<?xml version=\"1.0\" encoding=\"UTF-8\"?>";
}

3.http请求的xml报文转化

/**
 * 请求头
 * @Date 2022/6/20 下午2:42
 * @Version 1.0
 */
@Data
@XStreamAlias("commHead")
public class CommHead {

    private String tranCode;
    private String tranDate= DateUtil.formatDate(new Date(),DateUtil.FORMATTEXT04);
    private String tranTime= DateUtil.formatDate(new Date(),DateUtil.FORMATTEXT19);

    public CommHead(String tranCode) {
        this.tranCode=tranCode;
      
    }

}


/**
 * @Date 2022/6/20 下午2:48
 * @Version 1.0
 */
@Data
@XStreamAlias("Message")
public class Message<T>  {
    /**
     * 请求头
     */
    @XStreamAlias("commHead")
    private CommHead commHead;
    private T Body;

    public Message(CommHead commHead, T Body) {
        this.commHead=commHead;
        this.Body = Body;
    }

}


/**
 * 请求报文头
 * @Date 2022/6/20 下午2:55
 * @Version 1.0
 */
@Data
@XStreamAlias("BEDC")
public class BEDC<T> {
    /**
     * 请求报文消息体
     */
    private Message<T> Message;
}




/**
     * 查询接口
     * @param amountReq
     * @return
     */
    @Override
    public AmountVo queryAmount(AmountReq amountReq) {
        AmountVo amountVo = null;
        try {
            checkAmountBalanceRpcReq(amountReq);
            String xmlReq=convertAmountRequest(amountReq);
            log.info("接口入参【{}】", xmlReq);
            String xmlResp= query.query(amountReq.getCustId(),xmlReq);
            log.info("接口返回【{}】", xmlResp);
            amountVo=buildAmountResultRpc(xmlResp,amountReq);
        } catch (Exception e) {
            log.error("查询异常:{}", e);
            throw new Exception(ResponseCodeEnum.CALL_RPC_EXCEPTION.getCode(), ResponseCodeEnum.CALL_RPC_EXCEPTION.getMsg());
        }
        return amountVo;
    }



/**
     * 构建请求参数
     * @param amountBalanceRpcReq
     * @return
     */
    private String convertAmountRequest(AmountBalanceRpcReq amountBalanceRpcReq) throws Exception {
        //人力资源账簿开户接口
        //报文头
        CommHead commHead=new CommHead("SSSS");
        //报文内容
        A a = new A();
        a.setAccNo(amountBalanceRpcReq.getOrderNo());
        //报文消息
        Message<A> message=new Message(commHead,a);
        //报文封装
        BEDC<A> bedc=new BEDC<A>();
        bedc.setMessage(message);
        String xmlReq=XmlUtils.toXml(bedc);
        return xmlReq;
    }


public AmountVo buildAmountResultRpc(String response, AmountBalanceRpcReq amountBalanceRpcReq) throws Exception {
        //返解析泛型,指定具体class
        response = response.replace("<Body>","<Body class=\"com.jd.AResp\">" );
        AResp aResp=new AResp();
        if (CheckUtil.isNull(response)) {
            throw new YsHrPaymentException(ResponseCodeEnum.CALL_RPC_RESPONSE_NONE, "查询接口返回为空");
        }
        //报文头
        CommHead commHead=new CommHead("SSSS");
        //报文内容对象组装
        Message<AResp> message=new Message(commHead,new AResp());
        //报文封装
        BEDC<AResp> bedc=new BEDC<AResp>();
        bedc.setMessage(message);
        //xml报文转化为对象
        BEDC<AResp> bedcResponse=XmlUtils.toObject(response, bedc.getClass());
        aResp=(AResp)bedcResponse.getMessage().getBody();
        AmountVo amountVo = new AmountVo();

        return amountVo;
    }

4.Xstream相关的官方文档地址

XStream - Alias Tutorial

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
使用XStream库实现XML与对象之间的互转可以通过以下步骤完成: 1. 引入XStream库的依赖:在你的项目中引入XStream库的依赖,可以参考我之前提供的Maven和Gradle配置。 2. 定义Java类:创建一个Java类来表示你的对象,并使用XStream提供的注解来指定XML元素和属性与Java类的映射关系。例如: ```java import com.thoughtworks.xstream.annotations.XStreamAlias; @XStreamAlias("person") public class Person { private String name; private int age; // 省略构造函数、getter和setter方法 // ... } ``` 3. 将对象转换为XML:使用XStreamJava对象转换为XML字符串。示例如下: ```java import com.thoughtworks.xstream.XStream; public class Main { public static void main(String[] args) { // 创建XStream实例 XStream xStream = new XStream(); // 设置类别名,用于与XML元素进行映射 xStream.alias("person", Person.class); // 创建一个Person对象 Person person = new Person(); person.setName("John"); person.setAge(30); // 将Person对象转换为XML字符串 String xml = xStream.toXML(person); // 输出XML字符串 System.out.println(xml); } } ``` 以上代码将输出以下XML字符串: ```xml <person> <name>John</name> <age>30</age> </person> ``` 4. 将XML转换为对象:使用XStream将XML字符串转换回Java对象。示例如下: ```java import com.thoughtworks.xstream.XStream; public class Main { public static void main(String[] args) { // 创建XStream实例 XStream xStream = new XStream(); // 设置类别名,用于与XML元素进行映射 xStream.alias("person", Person.class); // XML字符串 String xml = "<person><name>John</name><age>30</age></person>"; // 将XML转换为Person对象 Person person = (Person) xStream.fromXML(xml); // 输出Person对象的属性 System.out.println("Name: " + person.getName()); System.out.println("Age: " + person.getAge()); } } ``` 以上代码将输出: ``` Name: John Age: 30 ``` 通过以上步骤,你可以使用XStream实现XML与对象之间的互转。你可以根据具体的需求对Java类和XML结构进行调整和扩展。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值