2013-05-31 191 views
7

我是春季Web服务的新手,在编写阶乘服务的示例程序后,我留下了一些疑惑。我认为这是春天的Web服务是如何工作的:春季Web服务流程


应用程序运行在服务器上,并产生一个请求 - >请求转到 调度的servlet在web.xml中定义 - >调度servlet查找 对于[servlet的名称] -servlet.xml后缀 - >调度的servlet然后查找 payloadroot其中找到正确的端点 - >的XML请求转到 终点 - >响应由端点产生


现在我的疑惑是:

  1. 那如何来端点请求到达XML形式?我知道XSD有助于创建xml,但是它何时做到这一点?
  2. 在这整个过程中什么时候构建了wsdl?

以下是bean定义即:[servlet-name]-servlet.xml文件:

<beans ...> 
    <bean id="findFactorialService" class="springws.findFactorial.FindFactorialServiceImpl"/> 

    <bean id="findFactorialServiceEndpoint" class="springws.findFactorial.endpoint.FindFactorialServiceEndpoint"> 
     <property name="findFactorialService" ref="findFactorialService" /> 
    </bean> 

    <bean id="payloadMapping" class="org.springframework.ws.server.endpoint.mapping.PayloadRootQNameEndpointMapping"> 
      <property name="defaultEndpoint" ref="findFactorialServiceEndpoint" /> 
     </bean> 

     <bean id="findFactorialSchema" class="org.springframework.xml.xsd.SimpleXsdSchema"> 
      <property name="xsd" value="/WEB-INF/findFactorialService.xsd" /> 
     </bean> 

     <bean id="findFactorial" class="org.springframework.ws.wsdl.wsdl11.DefaultWsdl11Definition"> 
      <property name="schema" ref="findFactorialSchema" /> 
      <property name="portTypeName" value="hello" /> 
      <property name="locationUri" value="http://localhost:7070/find-factorial-using-contractfirst/services" /> 
     </bean> 
    </beans> 

回答

4
  1. 的XSD不生成XML,它用于验证它。人们也在写客户端来了解如何形成他们的XML以发送给您的服务。 “请求”是某种类型的客户端向您的服务发送的消息 - 它通常通过http协议(万维网协议)进入您的服务。

  2. 你提到在你的代码,这意味着是契约优先 - 这意味着(尽管通常这是连同描述接口XSD做),你应该在你做任何事情之前写的WSDL 。然后,可以使用wsdl和一些注释来配置Spring,以便处理消息 - 甚至可以使用jaxb直接将代码自动绑定到代码中的java对象中,以便您不必手动分析传入的xml有效内容。

This is old,但它遵循您使用的相同方法,甚至使用相同的不推荐使用的弹簧类。

现在很多开发人员都采用WS- *风格的Web服务来支持基于REST的Web服务,这些Web服务通过使用spring-web和spring-mvc很容易实现,并且在java上有一些简单的注释POJO。如果你愿意的话,甚至可以让spring自动将你的xml载荷绑定到从xsd生成的java对象上,这样你就不必在任何时候实际处理XML。

0
  1. 弹簧使用JAXB序列化到xml和从请求解析。
  2. 如果您使用的是JAX-WS,则WSDL将在运行时生成(默认情况下),但也可以提供预生成的WSDL

为了解决您的评论:如果你看一看spring-ws-core Maven依赖

,你会发现,它有spring-oxm依赖(基于XML <的抽象 - >对象映射),其中有一个依赖于jaxb-api项目。

仔细研究一下您在依赖关系中实际使用的内容。 JAXB可能来自应用程序服务器库/文件夹。

第二点。 JAXB不仅用于序列化为xml,还可以从xml反序列化。

+0

第一件事:我没有使用任何JAXB服务或罐子..第二件事:JAXB使用java类转换为xml ..但请求仅以xml的形式到达终端..不在对象的形式。 – Chandeep

+0

更新了答案 – WeMakeSoftware