2011-06-16 137 views
1

我想从axis迁移到cxf,并且我有插件生成的java代码的wsdl文件。我有2个问题:从axis迁移到cxf

  1. 我在WSDL文件中的下列块:

    <xsd:element name="sendSms" type="parlayx_sms_send_local_xsd:sendSms"/> 
        <xsd:complexType name="sendSms"> 
        <xsd:sequence> 
         <xsd:element maxOccurs="unbounded" minOccurs="1" name="addresses" type="xsd:anyURI"/> 
         <xsd:element maxOccurs="1" minOccurs="0" name="senderName" type="xsd:string"/> 
         <xsd:element name="message" type="xsd:string"/> 
         <xsd:element maxOccurs="1" minOccurs="0" name="receiptRequest" type="parlayx_common_xsd:SimpleReference"/> 
        </xsd:sequence> 
        </xsd:complexType> 
    

    和任何URI生成到字符串而不是URI,没有人知道为什么吗?

  2. 该轴创建服务定位器类和绑定存根类,它允许添加到Web服务属性,如用户名,密码,超时等。我需要添加此属性,因为服务是通过安全连接,它们是不是web服务生成方法sendSms中的参数。 (你可以看到下面的定义)。

    <wsdl:portType name="SendSms"> 
        <wsdl:operation name="sendSms"> 
        <wsdl:input message="parlayx_sms_send:SendSms_sendSmsRequest"/> 
        <wsdl:output message="parlayx_sms_send:SendSms_sendSmsResponse"/> 
        <wsdl:fault message="parlayx_common_faults:ServiceException" name="ServiceException"/> 
        <wsdl:fault message="parlayx_common_faults:PolicyException" name="PolicyException"/> 
        </wsdl:operation> 
    </wsdl:portType> 
    
    <xsd:element name="sendSms" type="parlayx_sms_send_local_xsd:sendSms"/> 
        <xsd:complexType name="sendSms"> 
        <xsd:sequence> 
         <xsd:element maxOccurs="unbounded" minOccurs="1" name="addresses" type="xsd:anyURI"/> 
         <xsd:element maxOccurs="1" minOccurs="0" name="senderName" type="xsd:string"/> 
         <xsd:element name="message" type="xsd:string"/> 
         <xsd:element maxOccurs="1" minOccurs="0" name="receiptRequest" type="parlayx_common_xsd:SimpleReference"/> 
        </xsd:sequence> 
        </xsd:complexType> 
    

    我没有发现,我敢肯定它表明我如何添加这些值的任何实例。 你知道这样的例子吗?

感谢, 丹妮拉

回答

0

关于你的第一个问题,CXF使用JAXB(默认)做XML和对象之间的转换,并指定anyURI映射到String。如果您希望在无效URI上检查异常,则必须使用new URI(str)自己执行转换;如果您希望检查未经检查的异常,则必须使用URI.create(str)。虽然你可以注册一个自定义转换器来为你处理,但在我看来,它比自己做得复杂得多;每个URI参数有一行额外的代码(或者如果使用检查的异常路由,可能会有几行代码,这可能在形式上更好)。

关于第二个问题,关键是通过CXF(或任何其他JAX-WS兼容的客户端)生成的客户端存根实现javax.xml.ws.BindingProvider接口。这将导致代码有点像这样:

// Use the right things from your tooling here... 
SendSMS serviceInstance = new SMSSender().getSendSMSImplPort(); 

Map<String, Object> requestContext = 
     ((BindingProvider) serviceInstance).getRequestContext(); 
requestContext.put(BindingProvider.ENDPOINT_ADDRESS_PROPERTY, serviceAddress); 
requestContext.put(BindingProvider.USERNAME_PROPERTY, username); 
requestContext.put(BindingProvider.PASSWORD_PROPERTY, password); 
// And so on for all the properties you want to configure 

超时有点不同,因为在CXF他们configured at the conduit level。相关一块线程的似乎是这样的片段(其所属的cxf.xml文件中):

<http:conduit name="http://131.107.153.205/.*"> 
    <http:client ConnectionTimeout="0" ReceiveTimeout="0"/> 
</http:conduit> 

我不知道究竟你会如何改变,以适应您的需求(尤其是管道名称);这是我迄今为止一直坚持默认设置的地方。 (您可能能够set it at the code level - 请参阅评论 - 但对此我不太清楚。)另请注意,在上述情况下,两个超时由该代码设置为根本没有超时;这可能不是你想要的生产代码...

+0

感谢。 关于第二个答案,我不太确定如何找到绑定界面。我有一个接口SendSms与定义的方法和一个SendSmsService,从它我可以做getSendSms并接收接口。 – Daniela 2011-06-16 12:02:50

0

是的,CXF使用JAXB(默认情况下)在XML和对象之间进行转换,并指定anyURI映射到一个字符串。但是,可以更改Java类型和SOAP类型之间的绑定。下面是JAXB绑定文件,它映射到xs:anyURIjava.net.URI

<?xml version="1.0" encoding="UTF-8"?> 
<jaxb:bindings version="2.0" 
       xmlns:jaxb="http://java.sun.com/xml/ns/jaxb" 
       xmlns:xs="http://www.w3.org/2001/XMLSchema"> 

     <jaxb:globalBindings 
      xmlns:jaxb="http://java.sun.com/xml/ns/jaxb" 
      xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
      <jaxb:javaType name="java.net.URI" xmlType="xs:anyURI" 
       parseMethod="create" printMethod="toASCIIString" /> 
     </jaxb:globalBindings> 
</jaxb:bindings> 

要考虑到这一点使用给予选项-bwsdl2java,指定JAXWS或JAXB绑定文件

wsdl2java -b type-bindings.xml ...