spring - 创建自己的 xml 命名空间

标签 spring spring-boot web-services soap namespaces

我遵循了 https://spring.io/guides/gs/producing-web-service/ 上的教程用于创建将接收 SOAP 请求并应返回一些 SOAP 响应的应用程序。但是,教程中的命名空间只是一个示例。如何创建自己的命名空间(URI、前缀、内容...)?我一直在搜索,但没有成功......提前致谢!

最佳答案

正如我在上面的评论中提到的,您应该阅读这篇文章以了解什么是 XML 命名空间:What are XML namespaces for? .
在您的问题的上下文中,它的要点是它提供了有关 XML 中元素的一些上下文。例如,如果您的服务遇到 <table>元素,服务器怎么知道是什么类型的<table>这是?
是这个吗?
enter image description here
是这个吗?
enter image description here
或者是这个?
enter image description here
命名空间允许您通过添加命名空间来区分它们:

<table xmlns="urn:tabular-data:tables">
<table xmlns="urn:chemistry:periodic-table">
<table xmlns="urn:products:furniture:kitchen-table">
您可能还想查看 this question出去看看我在这里做了什么,但简而言之,我只是编造了这些。我当场发明了它们。
在您的示例中,您也可以这样做。
问题是 SOAP 消息是由不同元素组成的 XML。有些属于 SOAP 本身,有些属于您的应用程序,有些属于其他 web service specifications等,您的服务需要理解它们。这就是您使用命名空间的原因,以便为元素添加含义。例如,在该页面上,您有以下请求:
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
                  xmlns:gs="http://spring.io/guides/gs-producing-web-service">
   <soapenv:Header/>
   <soapenv:Body>
      <gs:getCountryRequest>
         <gs:name>Spain</gs:name>
      </gs:getCountryRequest>
   </soapenv:Body>
</soapenv:Envelope>
当您说它是一个信封时,您不是指任何信封,而是指一个 SOAP 信封。您知道这是一个 SOAP 信封,因为它的 namespace 是 http://schemas.xmlsoap.org/soap/envelope/ . SOAP 负载本身具有来自 namespace http://spring.io/guides/gs-producing-web-service 的元素。 .
两者都是发明的,唯一的区别是http://schemas.xmlsoap.org/soap/envelope/它被发明后被标准化为一个文件,以便每个人都知道它的含义。你不需要标准化你的(http://spring.io/guides/gs-producing-web-service 也不是),你只需要发明一个独特的和特定于你的上下文的东西。
人们通常使用他们拥有的域命名空间,甚至可能会在其中抛出一些时间戳。所以你可以使用例如 http://jovana-vajagic.com/2021/03/20/example-service如果您认为这对您来说是独一无二的。或者您可以使用 urn:uuid:8f4ac50e-574b-4936-b49b-8b129bea945b如果你愿意(我从 UUID 得到了随机 here )。
所以基本上,你只是发明了一个相当独特的,然后在你所遵循的那个例子的代码中替换它。
至于在该命名空间中定义元素,您将需要一个 XML schema您可以在其中定义元素、子元素、属性、它们的类型等。查看您正在学习的教程,您会看到 a section on XML schema :
<xs:schema 
  xmlns:xs="http://www.w3.org/2001/XMLSchema" 
  xmlns:tns="http://spring.io/guides/gs-producing-web-service"
  targetNamespace="http://spring.io/guides/gs-producing-web-service" 
  elementFormDefault="qualified">
    ...
您需要创建类似的东西,使用您的命名空间(如 http://jovana-vajagic.com/2021/03/20/example-service 或您选择的任何内容)并在其中声明您的元素。
您将有一些阅读要做:) 祝您好运!

关于spring - 创建自己的 xml 命名空间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66699283/

相关文章:

java - SseEmitter Spring MVC 返回传输已关闭,剩余未完成的读取数据

java - spring boot jpa无法创建表

java - 更改Swagger codegen中生成的支持文件的包

java - Spring框架: Bean Validation Api Error after executing Spring Boot

sql-server - 从 SQL 存储过程调用 SOAP Web 服务

c# - 如何从 html 页面后面的代码中读取值?或者有更好的方法吗?

java - 忽略 XML Unmarshal Java Spring 上的 ESC 特殊字符

java - Spring JMS - 指数消息重新传递策略被忽略

java - 如何利用Spring Boot原生支持更好的实现工厂模式?

json - Http API 响应 : List Vs Map