【问题标题】:Spring WS remove flexible URL, Restricting WSDL URL and service URLSpring WS 移除灵活 URL,限制 WSDL URL 和服务 URL
【发布时间】:2024-01-20 21:40:01
【问题描述】:

我正在尝试制作一个 Spring Boot Soap WebService 应用程序,并按照入门 (https://spring.io/guides/gs/producing-web-service/) 示例来学习如何做到这一点。

我已经创建了我想要的,但是我在这个设置中有两个 URL 问题,我找不到我应该更改什么配置来解决这个问题:

  • WSDL URL 基本是 localhost:8080/ws/countries.wsdl 但类似 localhost:8080/ws/whatever/countries.wsdl 的任何内容都是正确的
  • SoapUI 请求的服务 URL 是 localhost:8080/ws,但类似 ​​localhost:8080/ws/whatever 是正确的

我知道这是 Spring WS 的一项功能,但我想要一个固定的 URL(在这两种情况下都没有'whatever')并且找不到为此更改的内容

【问题讨论】:

  • 我认为你的问题很好。赞成:)
  • 您可以查看我的更改吗?

标签: soap spring-boot spring-ws


【解决方案1】:

没有直接的方式来限制你想要的方式。

  1. SOAP 服务不是基于 URL 的。
  2. SOAP 消息体描述端点。

您想要的东西可以通过以下方式实现。

更改ServletRegistrationBean 中的 URL 映射以限制 URL 访问

  1. 现有的/ws/* 映射是所有/ws/whatever url 成功响应的原因。
  2. 更改为new ServletRegistrationBean(servlet, "/ws");
  3. 效果是你不能请求/ws以外的URL
  4. 现在的问题是,您无法通过此映射获取 WSDL。

获取 WSDL 的解决方案

  1. DefaultWsdl11Definition 实际上是根据每个请求从 XSD 生成 WSDL。
  2. countries.wsdl 保存到resource 文件夹作为静态WSDL 文件。
  3. 删除DefaultWsdl11Definition bean。
  4. 像这样创建一个新的SimpleWsdl11Definition bean

    @Bean(name = "countries") public SimpleWsdl11Definition orders() { SimpleWsdl11Definition wsdl11Definition = new SimpleWsdl11Definition(); wsdl11Definition.setWsdl(new ClassPathResource("countries.wsdl")); return wsdl11Definition; }

  5. 现在在ServletRegistrationBean 中添加另一个静态 URL 映射。因为它最终看起来像new ServletRegistrationBean(servlet, "/ws", "/ws/countries.wsdl");

  6. 这种做法非常适合开发阶段,因为您可以轻松地发布更改后的定义。但生产环境推荐使用static-wsdl。详情**here

【讨论】:

  • 我不想在 URL 中添加 'whatever',我想禁用灵活的 URL 设置。
  • 所以,现在所有以下工作: localhost:8080/ws/countries.wsdl localhost:8080/ws/stuff/countries.wsdl localhost:8080/ws/stuff2/countries.wsdl ;我只希望 localhost:8080/ws/countries.wsdl 工作,其余的返回错误或被忽略
  • 请检查我的更正答案。我认为它会帮助你:)
【解决方案2】:

只是改变

return new ServletRegistrationBean(servlet, "/ws/*");

例如

return new ServletRegistrationBean(servlet, new String[]{
        "/ws/v1/countries.wsdl",
        "/ws/v2/countries.wsdl"
});

【讨论】: