soapui调用接口参数传递嵌套xml,多层CDATA表达形式验证

1.环境信息

开发工具:idea

接口测试工具:soapui

编程语言:java

项目环境:jdk1.8

webservice:jdk自带的jws

处理xml:jdk自带的jaxb

2.涉及代码

java 复制代码
package org.example.webdemo;

import javax.jws.WebMethod;
import javax.jws.WebService;

@WebService
public interface JaxbWebService {
    @WebMethod
    public String dealXml(String xml);
}
java 复制代码
package org.example.webdemo;
import javax.jws.WebService;

@WebService
public class JaxbWebServiceImpl implements JaxbWebService {
    @Override
    public String dealXml(String xml) {
        String result ="";
        if(xml !=null && xml.length()!=0){
            RootBean rootBean = (RootBean)JaxbUtil.convertXmlToObject(xml, RootBean.class);
            String bussinessBody = rootBean.getBody();
            BussinessBean bussinessBean = (BussinessBean)JaxbUtil.convertXmlToObject(bussinessBody, BussinessBean.class);
            result = bussinessBean.getName();
            System.out.println(String.format("成功获取到第二层的标签name的值:%s",result));
        }
        return result;
    }
}
java 复制代码
package org.example.webdemo;
import lombok.extern.slf4j.Slf4j;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.Unmarshaller;
import java.io.StringReader;

@Slf4j
public class JaxbUtil {
    public static Object convertXmlToObject(String xml,Class<?> clazz) {
        Object xmlObj = null;
        try {
            JAXBContext context = JAXBContext.newInstance(clazz);
            Unmarshaller unmarshaller = context.createUnmarshaller();
            StringReader sReader = new StringReader(xml);
            xmlObj = unmarshaller.unmarshal(sReader);
        } catch (Exception e) {
            log.error("Xml转换对象失败", e);
        }
        return xmlObj;
    }
}
java 复制代码
package org.example.webdemo;
import lombok.Data;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
@Data
@XmlRootElement(name = "Root")
@XmlAccessorType(XmlAccessType.FIELD)
public class RootBean {
    @XmlElement(name = "Body")
    public String body;
}
java 复制代码
package org.example.webdemo;
import lombok.Data;
import javax.xml.bind.annotation.*;

@Data
@XmlRootElement(name = "Bussiness")
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(propOrder = { "name", "action"})
public class BussinessBean {
    @XmlElement(name = "Name")
    public  String name;
    @XmlElement(name = "Action")
    public  String action;
}
java 复制代码
package org.example.webdemo;
import javax.xml.ws.Endpoint;

public class JaxbWebServicePublish {
    public static void main(String[] args) {
        Endpoint.publish("http://localhost:8080/websevice",new JaxbWebServiceImpl());
    }
}

3.测试验证

3.1启动 webservice服务

3.2 soapui调用接口

3.2.1 传递报文信息

<![CDATA[<?xml version="1.0" encoding="UTF-8"?>

<Root>

<Body><![CDATA[<?xml version="1.0" encoding="UTF-8"?>

<Bussiness>

<Name>xiaoming</Name>

<Action>run</Action>

</Bussiness>]]]]>><!CDATA\[\\]>

3.2.2 soapui工具调用接口

4.最终总结

4.1 传递参数的xml声明行前面存在换行或空格出错

声明行:<?xml version="1.0" encoding="UTF-8"?>

根节点的上面这个声明行不允许出现空格与空行,如果出现空行或空格后端会解析出错。

4.1.1 复现问题

拿到的报文在xmlspy验证也不通过的

4.2 CDATA标签不匹配导致解析失败

4.2.1复现问题

相关推荐
慧都小项5 小时前
夜间Web回归跑到一半停了?TestComplete 15.83提升批量测试稳定性
前端·测试工具·数据挖掘·回归·汽车·web
名字还没想好☜5 小时前
Java 21 switch 模式匹配实战:sealed 接口 + record 替代 if-instanceof 链
java·人工智能·后端·python·spring
devilnumber5 小时前
Java 30 组高频技术 / 知识点多角度对比
java·开发语言
Luminbox紫创测控5 小时前
汽车前照灯阳光灼烧:光学热仿真与太阳光模拟器验证
人工智能·测试工具·汽车·安全性测试·测试标准
摇滚侠5 小时前
《SpringBoot 3:入门与应用实战》第 6 章 Spring Boot 最佳实践 阅读笔记 10
java·spring boot·笔记
gugucoding6 小时前
57. 【Java】日志框架:SLF4J与Logback
java·开发语言·logback
今天的砖头有点烫手啊6 小时前
JVM 调优实战:从 GC 日志到参数优化,一次完整排查
java·jvm
爱奥尼欧6 小时前
10.C++ string 实现详解
java·开发语言·c++
小飞学编程...6 小时前
【equals 、Comparable、Comparator 三者的区别】
java·python
骇客野人6 小时前
Java分布式任务调度方案(完整落地指南)
java·开发语言·分布式