JAXB绑定JAXWS中的SOAP请求参数

Vin*_*nay 2 soap jax-ws jaxb

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

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

}
Run Code Online (Sandbox Code Playgroud)

MyObject类很简单.

 @XmlRootElement(name="Object")
 public class MyObject{
    private String item1;
    private String item2;
 }
Run Code Online (Sandbox Code Playgroud)

现在问题陈述.当我查看此方法的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>
Run Code Online (Sandbox Code Playgroud)

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

<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>  
Run Code Online (Sandbox Code Playgroud)

有人可以请一下建议.提前致谢.

gga*_*iao 5

您只需要在对象中添加一个"包装器",List如下所示:

 @XmlRootElement(name="objects")
 public class MyObjects{

    @XmlElement(name="object")
    List<MyObject> myObjects;
 }

public class MyObject{
    private String item1;
    private String item2;
 }
Run Code Online (Sandbox Code Playgroud)

注:更改根元素arg0objects与该标签@XmlRootElement(name="objects")将无法工作,因为你<objects>是不是在Web服务定义中的根元素.实际上它是你的一部分<wsdl:message>(所以JAXB将丢弃它).

您需要更改的是添加@WebParam(name = "objects")到您的@WebMethod喜欢的Web服务消息:

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

}
Run Code Online (Sandbox Code Playgroud)

如果你不想使用'包装',你可以保留你的WebMethod但是这样:

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

}
Run Code Online (Sandbox Code Playgroud)

但你会松开<objects>包装纸.请求应该是这样的:

<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>
Run Code Online (Sandbox Code Playgroud)