Я экспериментирую с 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")
?
См. Сообщение в Списке рассылки пользователей 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