webservice向服务端传递字符串数组

本文介绍了在WebService中遇到无法直接传递String数组作为参数的问题,通过将String数组转换为自定义类StringVo并使用@XmlRootElement注解成功解决了异常。在服务端接口中,接收自定义类型StringVo[]来实现批量删除IP的功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.功能是在webservice的客户端向服务端传一个字符串数组作为参数,批量删除ip
2.但是直接用String[] ids传递的话会报异常:No message body writer found for response class : L.String[]或者之类的。后换成List<String> ids也不行,报异常:No message body writer found for response class :ArrayList
3.于是把String[] ids包装在一个自定义的类里,还是报相同的异常。
4.于是把String包装了一层变成StringVo,并加注释 @XmlRootElement 此问题得以解决
5.另外:如果用get方法传递的话肯定不行?没有尝试。
6.如果想用Arraylist直接传值的话,可参考自定义一个message provider。



在IpPoolService.java中传入ip的id数组:
@Override
         public   String delAllIp(String[] ids, String callType) {
                          //String[] to StringVo[]
            StringVo[] idsVo = parseStringToStringVo(ids);
               try   {
                        String url =   "/iaasresource/ip/delete" ;
                              WebClient cloudosClient = WebClientFactory.getWebClient();
                              Result result = cloudosClient.back( true   ).path(url)
                                          .accept(MediaType.   APPLICATION_XML )
                                          .type(MediaType.   APPLICATION_XML )
                                          .post(idsVo,Result.   class );
                              
                                 if (result. resultCode   == Result. SUCCESS_CODE   ){
                                       return   "1"   ;
                              }   else   if   (result. resultCode   == Result. ERROR_CODE   ){
                                       return   "0"   ;
                              }
                              
            }   catch   (Exception e) {
                     //rtn = "批量删除IP失败," + e.getMessage();
                     logger .error(e.getMessage());
                     return   "-1"   ;
            }
               return   "0"   ;
      }

parseStringToStringVo方法如下:
         private   StringVo[] parseStringToStringVo(String[] ids) {
            StringVo[] ipsVo =   new   StringVo[ids. length   ];
            
               for ( int   i=0;i<ids. length ;i++){
                  ipsVo[i] =   new   StringVo();
                  ipsVo[i].setSrc(ids[i]);
            }
            
               return   ipsVo;
      }

StringVo类如下:
import   javax.xml.bind.annotation.XmlRootElement;

@XmlRootElement
public   class   StringVo   implements   Serializable{   
      String   src ;
         public   String getSrc() {
               return   src   ;
      }
         public   void   setSrc(String src) {
               this . src   = src;
      }
}

webservice端接口如下:
         //删除ip
         @WebMethod
         @POST
         @Path ( "/ip/delete"   )
         public   Response deleteIp(StringVo[] ipids);

### WebService数组的使用方法及实现方式 在 WebService 的开发过程中,处理数组是一个常见的需求。以下是关于如何在 WebService 中处理数组的具体说明: #### 1. 数组作为输入数 当需要通过 WebService 接收数组类型数时,可以通过定义相应的数据结构并将其映射到 XML Schema 类型中。例如,在 Java 中可以定义一个接收 `String` 或其他复杂对象数组的方法。 ```java @WebMethod public String processArray(@WebParam(name = "inputArray") List<String> inputArray) { StringBuilder result = new StringBuilder(); for (String item : inputArray) { result.append(item).append(","); } return result.toString(); } ``` 上述代码展示了如何接受一个字符串列表作为输入,并对其进行简单处理[^4]。 #### 2. 数组作为返回值 如果希望 WebService 方法返回数组,则可以在方法签名中指定返回类型为集合(如 `List<T>`),或者直接返回数组本身。对于复杂的自定义对象数组,需确保这些对象实现了序列化接口以便于传输。 以下示例展示了一个返回 GoodResult 对象数组服务端逻辑: ```java import java.util.ArrayList; import java.util.List; @WebService public class MyWebService { @WebMethod public List<GoodResult> getGoodsResults() { List<GoodResult> results = new ArrayList<>(); Vector<Good> goodsVector = new Vector<>(); goodsVector.add(new Good("Item1", "ID001")); goodsVector.add(new Good("Item2", "ID002")); results.add(new GoodResult(1, "Success", "", goodsVector)); results.add(new GoodResult(2, "Failure", "Error occurred", null)); return results; } } ``` 此代码片段基于引用中的描述创建了包含多个 Goods 和其结果的对象集合[^3]。 #### 3. 复杂对象与数组组合 针对更复杂的场景——比如嵌套有向量或其他容器的数据模型——应特别注意 SOAP 消息生成器的行为以及客户端解析能力。通常情况下,只要服务器端正确配置 WSDL 文件并通过标准工具生成代理类,大多数现代框架都能很好地支持这种模式。 例如,假设存在如下关系链:`GetWSByAxis2 -> GetGoodCount()` 返回的是封装好的 `GoodResult[]` 数据集;那么实际操作流程可能类似于这样: ```java try { MZ.GetWebService.GetWSByAxis2ws wsClient = new MZ.GetWebService.GetWSByAxis2(); int count = wsClient.getGoodCount(); // 调用远程服务获取商品数量 } catch(Exception e){ System.out.println(e.getMessage()); } ``` 这里利用了 AXIS 技术栈构建起完整的请求链条[^2]。 --- ### 注意事项 - **互操作性**:不同平台间传递数组可能会遇到兼容性问题,因此建议优先选用标准化协议和技术栈。 - **性能考量**:大规模数据交换可能导致网络延迟增加或内存占用过高,故而设计初期就要充分评估预期负载情况。 - **安全性保障**:敏感信息不应暴露在外网环境下随意访问,必要时启用认证机制保护 API 端口安全。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值