SOAP-message

 
 
 
Сообщения:206
Коллеги, добрый день.
С помощью jax-ws формирую soap-запрос:
import javax.jws.Oneway;
import javax.jws.WebMethod;
import javax.jws.WebParam;
import javax.jws.WebService;
import javax.jws.soap.SOAPBinding;
import javax.jws.soap.SOAPBinding.ParameterStyle;
import javax.xml.bind.annotation.XmlSeeAlso;

@WebService(targetNamespace="http://test", name="name1")
@XmlSeeAlso({ObjectFactory.class, test.ObjectFactory.class})
@SOAPBinding(parameterStyle=SOAPBinding.ParameterStyle.BARE)
public abstract interface SiPlmMaterialAsynOut
{
  @WebMethod(operationName="Execute", action="http://WebService/test")
  @Oneway
  public abstract void execute(@WebParam(partName="test_Material", name="test_Material", targetNamespace="http://test") 
  TestMaterial paramTest);
}


метод отрабатывает, все ок.
Можно ли как-то сформировать из этого именно soap-сообщение? чтобы его сохранить как файл
 
 
Сообщения:867
Приветствую!
Необходимо создать класс, реализующий SOAPHandler, через который можно получить доступ к заговоку и телу письма.
Прописать его в handler-chain.xml и зарегистировать через @HandlerChain.
 
 
Сообщения:206
gidravlic:
@HandlerChain


Большое спасибо за ответ.
Это можно только на клиентской стороне сделать? То есть это не надо же на сервер заливать?
Вот как я делаю. сервис:
@WebService(name = "SI_PLM_BOM_Async_Out", targetNamespace = "http://test.com/C/test/BOM")
@SOAPBinding(parameterStyle = SOAPBinding.ParameterStyle.BARE)
@XmlSeeAlso({
    ObjectFactory.class
})
@HandlerChain(file="handlers.xml")
public interface SIPLMBOMAsyncOut {


    /**
     * 
     * @param mtBOM
     */
    @WebMethod(operationName = "SI_PLM_BOM_Async_Out", action = "http://sap.com/xi/WebService/soap1.1")
    @Oneway
    public void siPLMBOMAsyncOut(
        @WebParam(name = "MT_BOM", targetNamespace = "http://test.com/C/test/BOM", partName = "MT_BOM")
        DTBOM mtBOM);

}


файл handlers.xml
<?xml version="1.0" encoding="UTF-8"?>
<handler-chains xmlns="http://java.sun.com/xml/ns/javaee">
    <handler-chain>
        <handler>
            <handler-name>com.test.bom.Inflate</handler-name>
            <handler-class>com.test.bom.Inflate</handler-class>
        </handler>
         <handler>
            <handler-name>com.test.bom.Increment</handler-name>
            <handler-class>com.test.bom.Increment</handler-class>
        </handler>
    </handler-chain>
</handler-chains>


и сам класс, реализующий хендлер
public class Inflate implements SOAPHandler<SOAPMessageContext> {

    public boolean handleMessage(SOAPMessageContext mc) {
        try {
            final SOAPMessage message = mc.getMessage();
            final SOAPBody body = message.getSOAPBody();
            final String localName = body.getFirstChild().getLocalName();

              System.out.println("localName="+localName);

            return true;
        } catch (SOAPException e) {
            return false;
        }
    }

    public Set<QName> getHeaders() {
        return Collections.emptySet();
    }

    public void close(MessageContext mc) {
    }

    public boolean handleFault(SOAPMessageContext mc) {
        return true;
    }
}
Изменен:25 сен 2018 07:25
 
 
Сообщения:206
почему-то не отрабатывает( систем аута не вижу
 
 
Сообщения:867
А где расположен handlers.xml? Он должен быть расположен возле скомпилированого класса.
Если используется java 1.8, то в хидере вместо <handler-chains xmlns="http://java.sun.com/xml/ns/javaee">; должно быть <javaee:handler-chains xmlns:javaee="http://xmlns.jcp.org/xml/ns/javaee/"; xmlns:xsd="http://www.w3.org/2001/XMLSchema">;
 
 
Сообщения:206
gidravlic:
<javaee:handler-chains xmlns:javaee="http://xmlns.jcp.org/xml/ns/javaee/";; xmlns:xsd="http://www.w3.org/2001/XMLSchema">;


поменяла :
<?xml version="1.0" encoding="UTF-8"?>
<javaee:handler-chains xmlns:javaee="http://xmlns.jcp.org/xml/ns/javaee/"; xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <handler-chain>
        <handler>
            <handler-name>com.test.bom.Inflate</handler-name>
            <handler-class>com.test.bom.Inflate</handler-class>
        </handler>
         <handler>
            <handler-name>com.test.bom.Increment</handler-name>
            <handler-class>com.test.bom.Increment</handler-class>
        </handler>
    </handler-chain>
</javaee:handler-chains>


Не появляется..
 
 
Сообщения:867
Вы что-то делаете не так. Документация довольно хорошо расписана.
<handler-class>com.test.bom.Inflate</handler-class>
Правильно ли расположен класс?
<handler-class>com.test.bom.Increment</handler-class>
По исходникам такого класса нет.

Где расположен handlers.xml?
 
 
Сообщения:206
gidravlic:
>com.test.bom.Increment


handlers.xml в том же пакете, что и Inflate и сам класс сервиса:
@WebService(name = "SI_PLM_BOM_Async_Out", targetNamespace = "http://test.com/C/test/BOM")
@SOAPBinding(parameterStyle = SOAPBinding.ParameterStyle.BARE)
@XmlSeeAlso({
    ObjectFactory.class
})
@HandlerChain(file="handlers.xml")
public interface SIPLMBOMAsyncOut {


класс Increment в том же самом пакете. Он практически идентичен классу Inflate, поэтому его не привожу.
Мне вот один момент непонятен. Я прописываю @HandlerChain(file="handlers.xml") для всего WebService.

То есть в пакете com.test.bom находятся:handlers.xml, Increment, Inflate, SIPLMBOMAsyncOut.
 
 
Сообщения:867
Не обязательно. handlers.xml должен быть доступен из класса, где описывается @HandlerChain. Там прописываете в <handler-class> полное название класса с пакетом. Чем собираете проект? Maven? Или Ant?
 
 
Сообщения:206
gidravlic:
Не обязательно. handlers.xml должен быть доступен из класса, где описывается @HandlerChain. Там прописываете в <handler-class> полное название класса с пакетом. Чем собираете проект? Maven? Или Ant?


Вызываю просто в нетбинсе, варник не создаю.

Это клиент веб-сервиса. Не сервер. Вот что читаю:
при создании экземпляра клиента веб-сервиса, добавляем наш обработчик:

    List<Handler> list = new ArrayList<Handler>();
    list.add(new TestClientHandler());
    BindingProvider bp = (BindingProvider) port;
    bp.getBinding().setHandlerChain(list);
Здесь port - это ваш клиент веб-сервиса.

На стороне сервера принцип действия схожий, но обработчик добавляется по-другому. В Java-класс, реализующий веб-сервис, следует добавить аннотацию @HandlerChain:


То есть мне нужно все-таки вносить изменения в сервер? или только в клиент?
 
 
Сообщения:867
Можно отдельно и на стороне клиента и на стороне сервера
 
Модераторы:wedens
Сейчас эту тему просматривают:Нет