Как обеспечить, сервер адресуют к настроенному Spring Apache основанный на CXF клиент веб-сервиса?

Я экспериментирую с Apache CXF и имею вопрос о клиентской части.

Ниже моя текущая конфигурация Spring клиента WS некоторых com.example.customerservice.service.CustomerService:

<jaxws:client
    name="com.example.customerservice.service.CustomerServiceClient"
    serviceName="customer:CustomerServiceService" endpointName="customer:CustomerServiceEndpoint"
    address="http://localhost:8080/CustomerServicePort"
    serviceClass="com.example.customerservice.service.CustomerService">
    <jaxws:features>
        <bean class="org.apache.cxf.feature.LoggingFeature" />
    </jaxws:features>
</jaxws:client>

Как Вы видите, address атрибут настроен статически. Это не подходит для меня, потому что я не знаю URL сервера заранее. Кроме того, в определенных сценариях я хотел бы использовать этот клиент для различных сервисов, которые имеют различные адреса.

Поэтому статическая конфигурация адреса сервера в Spring не является соответствующей. Таким образом, мой вопрос - как я могу сделать его динамичным?

  • В данный момент мое решение состоит в том, чтобы установить системное свойство - что-то как baseUrl и введите его в конфигурацию Spring с помощью заполнителя свойства configurer.
  • Другая возможность состояла бы в том, чтобы просто создать клиент вручную, который я действительно не люблю также.

Но я полагаю, что действительно пропускаю что-то. Возможно, существует возможность чего-то как clientFactory.createClientFor("http://myserver:8080")?

5
задан lexicore 20 April 2010 в 21:43
поделиться

1 ответ

См. Сообщение в Списке рассылки пользователей CXF .

У вас есть пара вариантов:

1) Если вы хотите оставить свой контекст Spring как есть и программно изменить адрес во время выполнения:

Вы можете установить стандартное свойство в контексте запроса . Вот пример того, как это сделать программно.

BindingProvider bp = (BindingProvider) порт; Контекст карты = bp.getRequestContext (); Объект oldAddress = context.get (BindingProvider.ENDPOINT_ADDRESS_PROPERTY); context.put (BindingProvider.ENDPOINT_ADDRESS_PROPERTY, newAddress);

При этом вы следует знать о многопоточном доступе к клиентскому прокси . См. CXF FAQ (Являются ли клиентские прокси-серверы JAX-WS потокобезопасными?)

2) Если вы хотите / можете предоставить URL-адреса WSDL и использовать API-интерфейсы JAX-WS, вы можете написать переносимый код, который будет создайте клиентский прокси, подключенный к конечной точке по вашему выбору. Вы можете использовать атрибут createdFromAPI (Настройка Spring Client (Вариант 1)) в вашем контекстном файле Spring, чтобы по-прежнему разрешать конфигурацию на основе Spring программно созданного прокси-сервера клиента. {{1} } Я думаю, что здесь также поддерживаются подстановочные знаки, поэтому вы должны иметь возможность настроить несколько клиентов, используя одну запись в вашем контексте Spring. Этот подход станет более сложным, если пространства имен / локальные имена конечных точек сильно различаются между конечными точками, с которыми вы пытаетесь взаимодействовать.

3) Используйте org.apache.cxf.jaxws.JaxWsProxyFactoryBean программно, как показано в конфигурации Spring Конфигурации клиента Spring (вариант 2) [2]. Это позволяет вам установить интерфейс, адреса и создания новых экземпляров клиентского прокси по желанию. Вы даже можете настроить один экземпляр этой фабрики с большинством свойств, уже установленных в Spring, а затем вставить его в свой код, где вы можете изменить адрес и создать новый клиентский прокси {{ 1}} по желанию (конечно, обеспечивая синхронизированный доступ к фабричному компоненту). Вы также можете кэшировать клиентские прокси, чтобы избежать затрат на повторное их повторное создание.

http: // cxf.apache.org/faq.html#FAQ-AreJAXWSclientproxiesthreadsafe%253F http://cxf.apache.org/docs/jax-ws-configuration.html

4
ответ дан 15 December 2019 в 00:55
поделиться
Другие вопросы по тегам:

Похожие вопросы: