AXIS客户端版本AXIS2服务

时间:2012-03-15 22:26:18

标签: axis2 axis mtom

我必须实现一个使用AXIS2 1.4方法的AXIS 1.4客户端。 AXIS 1.4客户端是通过创建存根来完成的。客户端发送请求并通过某些附件(MTOM)从服务中获取响应。当我通过AXIS 1.4端口类型对象调用方法(操作)时出现错误:

org.xml.sax.SAXException: SimpleDeserializer encountered a child element, which is NOT expected, in something it was trying to deserialize.

我认为MTOM搞砸了AXIS。所以问题是:我如何获得AXIS2 1.4(MTOM)Web服务的附件? TIA。

弗朗西斯

P.S:这是代码。 WSDL生成了存根。问题是:当我调用端口的stub方法时,我得到异常。我收到的邮件中有附件。

String codistat = "CODISTAT";    
OrdinanzeViabilitaLocator ovlocretreive = new OrdinanzeViabilitaLocator();
ovlocretreive.setOrdinanzeViabilitaHttpSoap11EndpointEndpointAddress(".. the service url + action..");
try {
  OrdinanzeViabilitaPortType ovretreive = ovlocretreive.getOrdinanzeViabilitaHttpSoap11Endpoint();
  ((Stub) ovretreive)._setProperty(javax.xml.rpc.Call.USERNAME_PROPERTY, "username");
  ((Stub) ovretreive)._setProperty(javax.xml.rpc.Call.PASSWORD_PROPERTY, "password");            
  //problems began here
  MessageReqOrdinanze mrq = new MessageReqOrdinanze();
  mrq.setCodistat(codistat);
  Calendar date_from = Calendar.getInstance();
  date_from.setTimeInMillis(0);
  Calendar date_to = Calendar.getInstance();
  date_from.setTimeInMillis(0);
  mrq.setDate_from(date_from);
  mrq.setDate_to(date_to);
  // the next line generate the exception
  MessageOrdinanze mretreive = ovretreive.getOrdinanze(mrq);
  } catch (AxisFault e) {
        e.printStackTrace();
  } catch (RemoteException e) {
        e.printStackTrace();
  } catch (FileNotFoundException e) {
        e.printStackTrace();
  } catch (IOException e) {
        e.printStackTrace();
  } catch (ServiceException e) {
        e.printStackTrace();
  }

我收到的消息有一个

<xop:include href="cid... >...< ../xop/include"/>
内部的

标签,它是MTOM(它引起了我猜的异常)。 希望这会有所帮助。

2 个答案:

答案 0 :(得分:4)

要使MTOM在客户端工作,需要做两件事:

  1. 确保在存根中,xs:base64Binary类型已映射到java.activation.DataHandler而不是byte[]
  2. 为使用xs:base64Binaryjava.activation.DataHandler(支持MTOM)的JAFDataHandlerSerializerJAFDataHandlerDeserializer设置(运行时)类型映射。
  3. 第二部分相当容易。只需使用以下类型映射设置client-config.wsdd文件:

    <typeMapping languageSpecificType="java:javax.activation.DataHandler" qname="xs:base64Binary"
                 deserializer="org.apache.axis.encoding.ser.JAFDataHandlerDeserializerFactory"
                 serializer="org.apache.axis.encoding.ser.JAFDataHandlerSerializerFactory" 
                 encodingStyle=""/>
    

    第一部分更棘手,因为Axis 1.4中的工具(wsdl2java)不支持更改与给定XML类型关联的Java类型。有几种方法可以解决这个限制:

    • 手动编辑生成的存根,并将byte[]更改为javax.activation.DataHandler。根据您在项目中管理生成代码的方式,这可能是也可能不是可接受的解决方案。
    • 可能(尽管我没有测试过)将wsdl2java变为使用javax.activation.DataHandler,为其提供一个修改过的WSDL,类型为{http://www.w3.org/2001/XMLSchema} base64Binary由{java} javax.activation.DataHandler。
    • 取代
    • 我在当前的Axis主干中修复了工具,以便它支持这种类型的配置。但请注意,这仅在wsdl2java Maven插件中实现(但不在Ant任务或命令行工具中实现)。您可以使用该插件的1.4.1-SNAPSHOT版本;生成的代码仍然适用于Axis 1.4。您可以找到一些文档here

答案 1 :(得分:0)

以上解决方案很棒。但是,那些可能正在努力使上述代码段工作的人,请使用xmlns:xs="http://www.w3.org/2001/XMLSchema",然后只有typeMapping代码段才能使用。

<typeMapping qname="xs:base64Binary" languageSpecificType="java:javax.activation.DataHandler"
deserializer="org.apache.axis.encoding.ser.JAFDataHandlerDeserializerFactory"
    serializer="org.apache.axis.encoding.ser.JAFDataHandlerSerializerFactory"
    xmlns:xs="http://www.w3.org/2001/XMLSchema" encodingStyle="" />