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;
相关推荐
kfepiza13 分钟前
HttpSessionAttributeListener 的用法笔记250417
java·spring boot·笔记·servlet·java-ee·tomcat
苹果酱056744 分钟前
redis系列--1.redis是什么
java·vue.js·spring boot·mysql·课程设计
百锦再1 小时前
Android Studio 中文字大小的单位详解
android·xml·java·ide·app·android studio
扣丁梦想家1 小时前
Spring Boot 实现 Excel 导出功能(支持前端下载 + 文件流)
spring boot·后端·excel
Java程序之猿2 小时前
Spring Boot 集成spring-boot-starter-data-elasticsearch
spring boot·elasticsearch·jenkins
王伯爵3 小时前
Spring Boot 应用程序中配置使用consul
spring boot·consul·java-consul
小杨4043 小时前
springboot框架项目实践应用二十一(git实战)
spring boot·git·后端
m0_726965984 小时前
Java Bean演进历程:从POJO到Spring Boot配置绑定
java·开发语言·spring boot
八股文领域大手子5 小时前
深入浅出 Redis:核心数据结构解析与应用场景Redis 数据结构
java·数据结构·数据库·人工智能·spring boot·redis·后端
图南随笔8 小时前
Spring Boot(二十二):RedisTemplate的List类型操作
windows·spring boot·list