Spring Boot WS中WSDL的.与?表示法适配及URL重写配置问题
解决Spring Boot契约优先Web服务WSDL地址重写问题
我来帮你搞定这个WSDL地址的转换需求,既然已经集成了Tuckey UrlRewriteFilter,只需要配置正确的规则就能实现http://localhost:8080/ws/countries?wsdl到http://localhost:8080/ws/countries.wsdl的内部转发,具体步骤如下:
1. 确保UrlRewriteFilter依赖正确(若未添加)
如果你的项目还没引入Tuckey的依赖,先在pom.xml中添加适配Spring Boot 2.x的版本:
<dependency> <groupId>org.tuckey</groupId> <artifactId>urlrewritefilter</artifactId> <version>4.0.4</version> </dependency>
2. 注册UrlRewriteFilter到Spring Boot容器
创建一个配置类,手动注册过滤器并指定配置文件路径:
import org.springframework.boot.web.servlet.FilterRegistrationBean; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.tuckey.web.filters.urlrewrite.UrlRewriteFilter; @Configuration public class UrlRewriteConfig { @Bean public FilterRegistrationBean<UrlRewriteFilter> urlRewriteFilter() { FilterRegistrationBean<UrlRewriteFilter> registrationBean = new FilterRegistrationBean<>(); UrlRewriteFilter urlRewriteFilter = new UrlRewriteFilter(); registrationBean.setFilter(urlRewriteFilter); // 指定urlrewrite配置文件的位置 registrationBean.addInitParameter("confPath", "/urlrewrite.xml"); // 只过滤ws路径下的请求,避免影响其他接口 registrationBean.addUrlPatterns("/ws/*"); return registrationBean; } }
3. 编写URL重写规则
在src/main/resources下创建urlrewrite.xml文件,添加针对WSDL地址的重写规则:
<?xml version="1.0" encoding="utf-8"?> <!DOCTYPE urlrewrite PUBLIC "-//tuckey.org//DTD UrlRewrite 4.0//EN" "http://www.tuckey.org/res/dtds/urlrewrite4.0.dtd"> <urlrewrite> <!-- 针对单个服务的规则:匹配/ws/countries且带wsdl参数的请求,转发到对应的.wsdl地址 --> <rule> <from>^/ws/countries$</from> <condition type="parameter" name="wsdl" operator="equal">true</condition> <!-- 使用forward类型实现内部转发,浏览器地址栏不会变化 --> <to type="forward">/ws/countries.wsdl</to> </rule> <!-- 可选:如果有多个Web服务,用通配符规则批量适配 --> <!-- <rule> <from>^/ws/([a-zA-Z0-9_-]+)$</from> <condition type="parameter" name="wsdl" operator="equal">true</condition> <to type="forward">/ws/$1.wsdl</to> </rule> --> </urlrewrite>
4. 验证规则生效
启动Spring Boot服务后,访问http://localhost:8080/ws/countries?wsdl,你会看到和http://localhost:8080/ws/countries.wsdl完全一致的WSDL内容,且浏览器地址栏保持为带?wsdl的格式,满足消费方的要求。
注意事项
- 一定要使用
type="forward"的转发类型,这样是内部服务器跳转,不会改变外部访问的URL;如果用redirect会导致地址栏变成.wsdl的格式,不符合需求。 - 通配符规则适合多个Web服务的场景,不用为每个服务单独编写规则。
内容的提问来源于stack exchange,提问作者Javadroider
相关产品推荐
相关产品推荐

