У меня есть веб-служба tomcat, которая принимает XML-запросы OTA opentravel.org и отвечает соответствующим образом. Он использует классы JibX OTA.
До сих пор пользователи сервиса использовали POX, и он работал очень хорошо, но новый пользователь хочет использовать SOAP и добавить учетные данные безопасности в заголовок SOAP следующим образом (вместо того, чтобы помещать им фрагмент POS xml)...
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Header>
<wsse:Security soap:mustUnderstand="1" xmlns:wsse="http://docs.oasis-open.org /wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd">
<wsse:UsernameToken>
<wsse:Username>USERNAME</wsse:Username>
<wsse:Password Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401- wss-username-token-profile-1.0#PasswordText">SECRET</wsse:Password>
</wsse:UsernameToken>
</wsse:Security>
</soap:Header>
Поэтому для аутентификации запроса, я думаю, мне нужно получить доступ к заголовкам из класса реализации службы.
Я проверил пример заголовков SOAP, который, я думаю, говорит мне, что я могу получить доступ к заголовкам, также включив inContext, например.
public RoomListRS list(RoomListRQ roomListRQ, InContext inCtx){
....
}
поэтому в этом методе я могу сделать это...
Security security = (Security ) inCtx.getAttribute("security");
поэтому я могу получить доступ к токену имени пользователя внутри,
...уточнив это в сервисе...
<service name="OTAService">
<service-class>com.xx.webservice.ota.HotelServiceImpl</service-class>
<operation method="list"/>
<handler-class class="org.jibx.ws.io.handler.ContextAttributeUnmarshallingInHandler">
<constructor-arg value="com.xx.shared.soap.security.Security"/>
<constructor-arg value="security"/>
</handler-class>
</service>
Я правильно понял?
Итак, я создал класс Security, но оставил все пространство имен для начала, просто чтобы начать и доказать, что я могу получить доступ к чему-то в заголовке. На основании такого фрагмента...
<Security>
<UsernameToken>
<Username>USERNAME</Username>
<Password>SECRET</Password>
</UsernameToken>
</Security>
Поэтому я создал привязку с помощью bindgen, затем скомпилировал, а затем вызвал с помощью soapUI.
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns="http://www.opentravel.org/OTA/2003/05">
<soapenv:Header>
<Security>
<UsernameToken>
<Username>USERNAME</Username>
<Password>SECRET</Password>
</UsernameToken>
</Security>
</soapenv:Header>
<soapenv:Body>
<OTA_HotelRoomListRQ xmlns="http://www.opentravel.org/OTA/2003/05" Version="2.0">
....
</OTA_HotelRoomListRQ>
</soapenv:Body>
</soapenv:Envelope>
но когда я пытаюсь получить объект безопасности из контекста, он равен нулю.
У меня не тот конец палки?
Должен ли я просто создать другую службу с другой конечной точкой, используя что-то более SOAPY?
То, что я пытаюсь сделать, невозможно с JibX WS и inHandler?
Любые комментарии приветствуются.
большое спасибо, что не поленились ответить на мой вопрос.
Я пытаюсь пройти через то, что вы добавили. Я использовал вашу настройку и xsd для создания исходного кода Java и binding.xml.
Я скомпилировал классы и теперь пытаюсь их связать, но получаю эту ошибку:
C:\Java\wsse>java org.jibx.binding.generator.BindGen org.oasisopen.docs.wss.oasis200401wsswssecuritysecext1.SecurityHeaderType
Exception in thread "main" java.lang.IllegalStateException: No way to handle type java.lang.Object, referenced from org.oasisopen.docs.wss.oasis200401wsswssecuritysecext1.SecurityHeaderType
at org.jibx.binding.generator.BindGen.expandReferences(BindGen.java:227)
at org.jibx.binding.generator.BindGen.findReferences(BindGen.java:1010)
at org.jibx.binding.generator.BindGen.generate(BindGen.java:1124)
at org.jibx.binding.generator.BindGen.main(BindGen.java:1302)
Я собираюсь взглянуть на настройки bindgen, чтобы увидеть, проливает ли это какой-либо свет, поскольку это единственная подсказка, данная в ответ на эту проблему. Не могли бы вы рассказать мне, как вы обошли это?
Еще раз спасибо.