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