如何为Spring WS动态生成的dynamic-wsdl添加XSLT样式
可行实现方案
方案1:使用Servlet Filter拦截WSDL响应插入样式表声明
- 自定义一个Servlet Filter,匹配Spring WS暴露的WSDL请求路径(比如默认的
/services/*.wsdl) - 重写响应的HttpServletResponseWrapper,捕获WSDL的XML输出内容
- 在XML的首行(
<?xml version="1.0"?>之后)插入XSLT引用指令:<?xml-stylesheet type="text/xsl" href="/your-custom-stylesheet.xsl"?> - 把修改后的内容返回给浏览器即可
- 注意要设置正确的Content-Type,避免浏览器按纯文本解析
方案2:重写Spring WS的DynamicWsdl11Definition逻辑
- Spring WS的
DefaultWsdl11Definition是动态生成WSDL的核心类,你可以继承该类重写afterPropertiesSet方法 - 在生成的WSDL Document对象中,手动添加xml-stylesheet处理指令节点
- 将自定义的Definition类替换原有的动态WSDL注册Bean即可,不需要额外加拦截层
- 核心代码示例:
@Override public void afterPropertiesSet() throws Exception { super.afterPropertiesSet(); Document wsdlDoc = getWsdl11Definition().getDocument(); ProcessingInstruction xsltRef = wsdlDoc.createProcessingInstruction("xml-stylesheet", "type=\"text/xsl\" href=\"/wsdl-viewer.xsl\""); wsdlDoc.insertBefore(xsltRef, wsdlDoc.getDocumentElement()); }
方案3:前端代理层注入(如果有网关/反向代理)
- 如果你用Nginx、Spring Cloud Gateway这类代理层,可直接配置响应内容替换规则
- 匹配WSDL请求的响应,在XML开头插入XSLT引用指令,不需要修改服务端代码
- 适合不想改动现有业务服务代码的场景
注意事项
- 你使用的XSLT文件要作为静态资源暴露,保证浏览器可以正常访问,不要被权限拦截器拦截
- 如果WSDL有HTTPS跨域访问的场景,保证XSLT资源和WSDL同域或者配置正确的CORS规则
- 可以直接用成熟的开源WSDL渲染XSLT,不需要从零开发样式逻辑
内容的提问来源于stack exchange,提问作者Kévin Sallier
相关产品推荐
相关产品推荐

