Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / WS-Addressing header in WSDL / 6 сообщений из 6, страница 1 из 1
20.11.2013, 12:46:41
    #38471108
Niky4000
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
WS-Addressing header in WSDL
Мне нужно добавить заголовок WS-Addressing клиенту вызывающему Web-сервис.

Вот мой тестовый клиент:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
    public static void main(String[] args) throws Exception {
        // TODO code application logic here
        TestWebService wsdlConnection = getWSDLConnection();
        SomeOutputObject some = wsdlConnection.getSome(new SomeInputObject(2000, "Some Input String!!!"));
    }
    
    // Получаю порт
    private static TestWebService getWSDLConnection() throws Exception {

        final String user = "";
        final String password = "";
        String wsdl = "http://127.0.0.1:8888//TestWebService/TestWebService?wsdl";
        String namespace = "http://wsdl/";
        String name = "TestWebService";
        String port_namespace = "http://wsdl/";
        String port_name = "TestWebServicePort";

        if (user.length() > 0 || password.length() > 0) {

            Authenticator.setDefault(new Authenticator() {

                @Override
                protected PasswordAuthentication getPasswordAuthentication() {
                    return new PasswordAuthentication(
                            user,
                            password == null ? "".toCharArray() : password.toCharArray());
                }
            });

        }

        URL url = new URL(wsdl);
        //1st argument service URI, refer to wsdl document above
        //2nd argument is service name, refer to wsdl document above
        QName qname = new QName(namespace, name);
        Service service = Service.create(url, qname);
        QName portQname = new QName(port_namespace, port_name);
        TestWebService servicePort = service.getPort(portQname, TestWebService.class);
        if (user.length() > 0 || password.length() > 0) {
            BindingProvider bp = (BindingProvider) servicePort;
            bp.getRequestContext().put(BindingProvider.USERNAME_PROPERTY, user);
            bp.getRequestContext().put(BindingProvider.PASSWORD_PROPERTY, password == null ? "" : password);
        }
        
        
   // build a EndpiontReference of <wsa:ReplyTo>
    BindingProvider bp = (BindingProvider) servicePort;
    
//    W3CEndpointReference eee=new W3CEndpointReference(null);
//    eee.
//    
//    EndpointReference epr = EndpointReferenceManager.createEndpointReference(new URI(
//       "http://www.w3.org/2005/08/addressing/anonymous"));
//    epr.setReferenceParameter(new QName("http://mycompany.com/test", "someRefParam"),
//                "12345678");

    ((BindingProvider) servicePort).getRequestContext().put(BindingProvider.ENDPOINT_ADDRESS_PROPERTY, "Hello!!!");
        
        
        return servicePort;
    }


Вот здесь даются ответы:
http://www.techques.com/question/1-10813220/How-to-specify-ReplyTo-EndpointReference-in-a-JAX-WS-client
However, each JAX-WS runtime may provide additional proprietary API to set the headers.

Каждое окружение JAX-WS может предоставлять проприетарные API для установки заголовков.
http://stackoverflow.com/questions/10813220/how-to-specify-replyto-endpointreference-in-a-jax-ws-client
Но это для IBM WebSphere, а мне нужно что-то подобное для GlassFish или Stand-Alone-Java-Client.

Кто-нибудь с подобным сталкивался?
Пока ответа не нашёл.

У меня есть вот такое описание:
Атрибуты заголовков WS-Addressing
Пространство имен xmlns:a=" http://www.w3.org/2005/08/addressing"

11
a:Action
String
1
Тип запроса (идентификатор операции сервиса).
Пример:
<a:Action>urn:ihe:iti:2007:ProvideAndRegisterDocumentSet-b </a:Action>
12
a:MessageID
UUID
1
Уникальный ID сообщения.
Пример:
<a:MessageID>urn:uuid:6d296e90-e5dc-43d0-b455-7c1f3eb35d83</a:MessageID>
13
a:ReplyTo
String
1
При синхронном запросе – анонимный URI.
Пример:
<a:ReplyTo>
   <a:Address> http://www.w3.org/2005/08/addressing/anonymous</a:Address>
</a:ReplyTo> .
При асинхронном запросе – URI сервиса обратного вызова (МИС), для отправки ответного сообщения.
Пример:
<a:ReplyTo>
   <a:Address> http://192.168.2.4:9080/XdsService/DocumentSourceReceiver.svc</a:Address>
</a:ReplyTo>
14
a:To
String
1
Адрес конечной точки, куда отправляется данное сообщение.
Пример:
<a:To> http://192.168.2.4:9080/XdsService/IHEXDSRepository.svc</a:To>
15
a:RelatesTo
UUID
1
Уникальный ID сообщения-запроса в ответном сообщении.
Пример:
<a:RelatesTo>urn:uuid:6d296e90-e5dc-43d0-b455-7c1f3eb35d83</a:RelatesTo>



А вот здесь есть даже его схема:
http://www.w3.org/2006/03/addressing/ws-addr.xsd

А как мне вставить эти заголовки при вызове функции wsdlConnection.getSome???
...
Рейтинг: 0 / 0
20.11.2013, 12:48:20
    #38471112
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
WS-Addressing header in WSDL
GlassFish использует Metro.
Вводим в гугле Metro WS-Addressing
Получаем ссылку на мануал
https://metro.java.net/1.4/docs/wsaddressing.html
...
Рейтинг: 0 / 0
20.11.2013, 14:33:46
    #38471285
Niky4000
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
WS-Addressing header in WSDL
В результате чтения и google'ния я всего лишь добавил строку:
TestWebService servicePort = service.getPort(portQname, TestWebService.class,new AddressingFeature(true));
Результат получился таким:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
POST /TestWebService/TestWebService HTTP/1.1

Accept: text/xml, multipart/related

Content-Type: text/xml; charset=utf-8

SOAPAction: "http://wsdl/TestWebService/getSomeRequest"

User-Agent: JAX-WS RI 2.2.4-b01

Host: 127.0.0.1:8888

Connection: keep-alive

Content-Length: 730



<?xml version="1.0" ?><S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/"><S:Header><To xmlns="http://www.w3.org/2005/08/addressing">http://127.0.0.1:8888/TestWebService/TestWebService</To><Action xmlns="http://www.w3.org/2005/08/addressing">http://wsdl/TestWebService/getSomeRequest</Action><ReplyTo xmlns="http://www.w3.org/2005/08/addressing">
    <Address>http://www.w3.org/2005/08/addressing/anonymous</Address>
</ReplyTo><MessageID xmlns="http://www.w3.org/2005/08/addressing">uuid:c43893d8-41ac-40f9-822c-faf7afd3dd47</MessageID></S:Header><S:Body><ns2:getSome xmlns:ns2="http://wsdl/"><arg0><someInteger>2000</someInteger><someString>Some Input String!!!</someString></arg0></ns2:getSome></S:Body></S:Envelope>



Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
<S:Envelope>
	<S:Header>
		<To>
			http://127.0.0.1:8888/TestWebService/TestWebService
		</To>
		<Action>http://wsdl/TestWebService/getSomeRequest</Action>
		<ReplyTo>
			<Address>http://www.w3.org/2005/08/addressing/anonymous</Address>
		</ReplyTo>
		<MessageID>uuid:c43893d8-41ac-40f9-822c-faf7afd3dd47</MessageID>
	</S:Header>
	<S:Body>
		<ns2:getSome>
			<arg0>
				<someInteger>2000</someInteger>
				<someString>Some Input String!!!</someString>
			</arg0>
		</ns2:getSome>
	</S:Body>
</S:Envelope>


По всей видимости это было сделано для асинхронного вызова функций web-сервисов.
В синхронном случае:
<ReplyTo>
<Address> http://www.w3.org/2005/08/addressing/anonymous</Address>
</ReplyTo>
А вот как в асинхронном случае пока не знаю.
Пахнет этим:
Код: sql
1.
2.
        Dispatch<TestWebService> dispatched = service.createDispatch(portQname, TestWebService.class, Service.Mode.MESSAGE);
        dispatched.invokeAsyncю...


Или этим:
Код: sql
1.
2.
3.
4.
5.
6.
7.
        Future<?> invokeAsync = dispatched.invokeAsync(servicePort, new AsyncHandler<TestWebService>() {

                                    @Override
                                    public void handleResponse(Response<TestWebService> res) {
                                        res.get().getSome(null).
                                    }
                                });
...
Рейтинг: 0 / 0
20.11.2013, 14:37:57
    #38471293
Niky4000
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
WS-Addressing header in WSDL
Или ещё у getPort есть разновидность с параметром EndpointReference.
Может надо в эту сторону смотреть...
...
Рейтинг: 0 / 0
21.11.2013, 17:20:33
    #38473308
https
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
WS-Addressing header in WSDL
медицинские документооборот (иэмк)? знакомая тема, на данный момент занимаюсь этим)))
советую посмотреть статью с исходниками про асинхронные веб сервиса, там как раз пример с установкой адреса для callback вызова
http://victor-ichim.blogspot.ru/2011/09/asynchronous-web-services-with-ws.html
...
Рейтинг: 0 / 0
21.11.2013, 17:39:08
    #38473335
https
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
WS-Addressing header in WSDL
я бы еще посоветовал использовать интерфейс WSBindingProvider вместо BindingProvider =))
Код: java
1.
   WSBindingProvider bp = (WSBindingProvider) servicePort;
...
Рейтинг: 0 / 0
Форумы / Java [игнор отключен] [закрыт для гостей] / WS-Addressing header in WSDL / 6 сообщений из 6, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]