мигрируя от оси к cxf - PullRequest
       1

мигрируя от оси к cxf

2 голосов
/ 16 июня 2011

Я пытаюсь перейти от оси к cxf, и у меня есть файлы wsdl, которые плагин генерирует в код Java.У меня есть 2 вопроса:

  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 генерируется в строку вместо URI, кто-нибудь знает почему?

  2. Ось создает класс локатора службы и класс заглушки привязки, который позволяет добавлять к атрибутам веб-службы, таким как имя пользователя, пароль, время ожидания и т. Д.Служба подключена через защищенное соединение, и они не являются параметрами в сгенерированном веб-службой методе 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>
    

    Я не нашел ни одного примера, который, я уверен, демонстрирует, как я добавляю эти значения.Вы знаете о таком примере?

Спасибо, Даниэла

Ответы [ 2 ]

0 голосов
/ 15 января 2014

Да, CXF использует JAXB (по умолчанию) для преобразования между XML и объектами, и это указывает, что anyURI сопоставляется со строкой. Тем не менее, можно изменить привязку между типами 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 ...
0 голосов
/ 16 июня 2011

Что касается вашего первого вопроса, CXF использует JAXB (по умолчанию) для преобразования между XML и объектами, и это указывает, что anyURI сопоставляется с String.Вы должны выполнить преобразование самостоятельно, используя new URI(str), если вы хотите проверенное исключение для недействительного URI, или 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 они настроены на уровне канала .Соответствующим фрагментом этого потока, кажется, является этот фрагмент (который находится внутри файла cxf.xml):

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

Я не знаю точно, как бы вы изменили это, чтобы приспособиться к вашим требованиям (особенноназвание канала);это область, где я придерживаюсь настроек по умолчанию, если честно.(Возможно, вы сможете установить его на уровне кода - см. Комментарии - но мне это не особо понятно.) Также обратите внимание, что в приведенном выше коде два тайм-аута устанавливаются этим кодом, чтобы не было тайм-аута.совсем;это, вероятно, не то, что вы хотите в производственном коде ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...