从轴迁移到cxf

时间:2011-06-16 09:34:07

标签: cxf

我正在尝试从axis迁移到cxf,并且我有插件生成的wsdl文件到java代码。我有两个问题:

  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>
    

    并且anyURI生成为String而不是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>
    

    我没有找到任何我确定它会演示如何添加这些值的示例。 你知道这样的例子吗?

  3. 谢谢, 丹妮拉

2 个答案:

答案 0 :(得分: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 - 看到评论 - 但对我来说并不是特别清楚。)另请注意,上面的两个超时由该代码设置为根本没有超时;这可能不是你想要的生产代码...

答案 1 :(得分:0)

是的,CXF使用JAXB(默认情况下)在XML和对象之间进行转换,并指定anyURI映射到String。但是,可以更改Java类型和SOAP类型之间的绑定。这是JAXB的绑定文件,它将xs:anyURI映射到java.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>

要使用此选项,请将-b选项提供给wsdl2java,它指定JAXWS或JAXB绑定文件

wsdl2java -b type-bindings.xml ...