我正在尝试从axis迁移到cxf,并且我有插件生成的wsdl文件到java代码。我有两个问题:
我在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,有人知道为什么吗?
轴创建服务定位器类和绑定存根类,允许添加到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 :(得分: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 ...