SpringBoot使用Jackson-XML裁剪多余的根节点

相关博客:《SpringBoot集成WebService(wsdl)》

比如我们有以下入参

我们只需要MedicalCardInfo这个根节点,其余都不要。如何处理?

xml 复制代码
<A>
    <B>
        <Sender>Aa</Sender>
        <MsgType>Bb</MsgType>
        <MsgVersion>Cc</MsgVersion>
    </B>
    <MsgBody>
        <MedicalCardInfo>
            <AuthorOrganization>1</AuthorOrganization>
            <IdCard>1234567</IdCard>
        </MedicalCardInfo>
    </MsgBody>
</A>

解决办法

java 复制代码
	private String getTargetXmlString(String sourceXmlString, String xmlRootElement) throws ParserConfigurationException, TransformerException, IOException, SAXException {
        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
        DocumentBuilder builder = factory.newDocumentBuilder();
        Document document = builder.parse(new InputSource(new StringReader(sourceXmlString)));

        NodeList msgBodyList = document.getElementsByTagName(xmlRootElement);
        if (msgBodyList.getLength() == 0) {
            return null;
        }
        Node msgBodyNode = msgBodyList.item(0);
        TransformerFactory transformerFactory = TransformerFactory.newInstance();
        Transformer transformer = transformerFactory.newTransformer();
        transformer.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "yes");
        transformer.setOutputProperty(OutputKeys.INDENT, "yes");
        StringWriter writer = new StringWriter();
        transformer.transform(new DOMSource(msgBodyNode), new StreamResult(writer));
        return writer.getBuffer().toString();
    }

    @Test
    public void test() throws ParserConfigurationException, IOException, TransformerException, SAXException {
        String params = "<A>\n" +
                "    <B>\n" +
                "        <Sender>Aa</Sender>\n" +
                "        <MsgType>Bb</MsgType>\n" +
                "        <MsgVersion>Cc</MsgVersion>\n" +
                "    </B>\n" +
                "    <MsgBody>\n" +
                "        <MedicalCardInfo>\n" +
                "            <AuthorOrganization>1</AuthorOrganization>\n" +
                "            <IdCard>1234567</IdCard>\n" +
                "        </MedicalCardInfo>\n" +
                "    </MsgBody>\n" +
                "</A>";
        params = getTargetXmlString(params, "MedicalCardInfo");
        System.out.println(params);
    }

输出

xml 复制代码
<MedicalCardInfo>
    <AuthorOrganization>1</AuthorOrganization>
    <IdCard>1234567</IdCard>
</MedicalCardInfo>

配合Jackson-XML使用

伪代码

java 复制代码
		//获取统一入口接口
		IWebService<T> webService = (IWebService<T>) ApplicationContextUtils.getBean(service);
		//获取统一入口接口请求泛型参数的具体 DTO
        Class<T> parameterType = (Class<T>) WebServiceTypeCache.getParameterType(service);
        //获取具体 DTO @JacksonXmlRootElement注解 localName 的 value(即需要的根节点)
        JacksonXmlRootElement annotation = parameterType.getAnnotation(JacksonXmlRootElement.class);
        String xmlRootElement = annotation.localName();
        //截取并替换根节点为需要的根节点
        params = getTargetXmlString(params, xmlRootElement);
        //转为具体的请求DTO
        T req = JacksonUtils.xmlMapper.readValue(params, parameterType);
        //调用具体的实现类的方法,并传入具体的请求 DTO
        R r;
        try {
            r = R.ok(webService.handle(req));
        } catch (Exception e) {
            log.error("{}异常:", service, e);
            r = R.error(e.getMessage());
        }
        String rString = JacksonUtils.xmlMapper.writeValueAsString(r);
        log.info("{}出参:{}", service, rString);
        return rString;
相关推荐
javadaydayup18 分钟前
3 个案例看透 Spring @Component 扫描:从普通应用到 Spring Boot
spring boot·后端·spring
Derek_Smart2 小时前
从零构建高并发锁工具:基于AOP与ReentrantLock的轻量级分布式锁实践
java·jvm·spring boot
一只叫煤球的猫11 小时前
⚠️ 不是危言耸听,SpringBoot正在毁掉Java工程师
java·spring boot·spring
IT小辉同学12 小时前
Spring Boot Redis 缓存完全指南
spring boot·redis·缓存
麦兜*13 小时前
LangChain4j终极指南:Spring Boot构建企业级Agent框架
java·spring boot·spring·spring cloud·ai·langchain·ai编程
fatfishccc15 小时前
【MyBatis新手避坑】详解 `Could not find resource ...Mapper.xml` 错误
xml·intellij-idea·mybatis
hrrrrb15 小时前
【Spring Boot 快速入门】八、登录认证(二)统一拦截
hive·spring boot·后端
你我约定有三17 小时前
云服务器--阿里云OSS(2)【Springboot使用阿里云OSS】
服务器·spring boot·阿里云
苹果醋318 小时前
React Native jpush-react-native极光推送 iOS生产环境接收不到推送
java·运维·spring boot·mysql·nginx
helloworld工程师21 小时前
Dubbo应用开发之基于xml的第一个Dubbo程序
xml·dubbo·safari