【问题标题】:JAXB Binding for SOAP request parameter in JAXWSJAXWS 中 SOAP 请求参数的 JAXB 绑定
【发布时间】:2012-06-21 07:22:46
【问题描述】:

我的任务是为更新操作编写一个 Web 服务,其中将对象列表传递给方法。

@WebMethod(operationName = "updateObjects", action = "urn:preferences")
public boolean updateObjects(List<MyObject> objects){

}

MyObject 类很简单。

 @XmlRootElement(name="Object")
 public class MyObject{
    private String item1;
    private String item2;
 }

现在是问题陈述。当我查看此方法的 SOAP 请求(为我生成的 SOAP UI)时,请求如下所示:

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:pref="preferences">
   <soapenv:Header/>
   <soapenv:Body>
      <pref:updateObjects>
         <!--Zero or more repetitions:-->
         <arg0>
            <!--Optional:-->
            <item1>?</item1>
            <!--Optional:-->
            <item2>?</item2>
         </arg0>
      </pref:updateObjects>
   </soapenv:Body>
</soapenv:Envelope>

但我希望它看起来像下面。

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:pref="preferences">
   <soapenv:Header/>
   <soapenv:Body>
      <pref:updateObjects>
         <!--Zero or more repetitions:-->
         <Objects>
             <Object>
                <!--Optional:-->
                <item1>?</item1>
                <!--Optional:-->
                <item2>?</item2>
             </Object>
             <Object>
                <!--Optional:-->
                <item1>?</item1>
                <!--Optional:-->
                <item2>?</item2>
             </Object>
         </Objects>  
      </pref:updateObjects>
   </soapenv:Body>
</soapenv:Envelope>  

有人可以请教。提前致谢。

【问题讨论】:

    标签: soap jaxb jax-ws


    【解决方案1】:

    您只需将“包装器”添加到您的 List 对象中,如下所示:

     @XmlRootElement(name="objects")
     public class MyObjects{
    
        @XmlElement(name="object")
        List<MyObject> myObjects;
     }
    
    public class MyObject{
        private String item1;
        private String item2;
     }
    

    注意:使用标签@XmlRootElement(name="objects") 将根元素从arg0 更改为objects 将不起作用,因为您的&lt;objects&gt; 不是Web 服务定义中的根元素。实际上它是你的&lt;wsdl:message&gt; 的一部分(所以 JAXB 会丢弃它)。

    您需要更改的是向您的@WebMethod 添加@WebParam(name = "objects") 的网络服务消息,例如:

    @WebMethod(operationName = "updateObjects", action = "urn:preferences")
    public boolean updateObjects(@WebParam(name = "objects") MyObjects objects){
    
    }
    

    如果您不想使用“包装器”,您可以保留您的 WebMethod,但像这样:

    @WebMethod(operationName = "updateObjects", action = "urn:preferences")
    public boolean updateObjects(@WebParam(name = "object") List<MyObject> objects){
    
    }
    

    但您将丢失 &lt;objects&gt; 包装器。请求应该是这样的:

    <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:pref="preferences">
       <soapenv:Header/>
       <soapenv:Body>
          <pref:updateObjects>
             <!--Zero or more repetitions:-->
             <object>
                <!--Optional:-->
                <item1>?</item1>
                <!--Optional:-->
                <item2>?</item2>
             </object>
          </pref:updateObjects>
       </soapenv:Body>
    </soapenv:Envelope>
    

    【讨论】:

    • 非常感谢 ggarcio 的快速响应。难道没有一种方法可以在不创建包装类的情况下做到这一点(通过任何为我们包装的注释)?对于不同的对象列表,我有 8 种这样的方法:(
    猜你喜欢
    • 1970-01-01
    • 2018-04-06
    • 1970-01-01
    • 2015-11-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-05
    相关资源
    最近更新 更多