Могу ли я создать общий метод веб-службы / отправки, который отвечает на ВСЕ запросы с помощью JAX-WS? - PullRequest
5 голосов
/ 11 августа 2011

Я пытаюсь создать общий веб-сервис, который всегда будет отвечать «ОК», независимо от заголовка запроса или содержимого тела.Я могу сделать это в Axis2 с RawXMLInOutMessageReceiver, но я бы предпочел использовать JAX-WS (к которому я совершенно новичок), если это вообще возможно.Пока у меня есть простой интерфейс:

@WebService
public interface DummyService {
    @WebMethod String processMessage(Object obj);
}

и простая реализация:

@WebService(endpointInterface = "com.dummyservice.DummyService")
public class DummyServiceImpl implements DummyService {
    @Override
    public String processMessage(Object obj) {
        return "OK";
    }
}

Я могу успешно опубликовать сервис с javax.xml.ws.Endpoint#publish(...), но когда я нажму его спростой запрос SOAP, например,

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
  <soapenv:Header/>
  <soapenv:Body>
   <derp/>
  </soapenv:Body>
</soapenv:Envelope>

Меня приветствует SOAPFault с указанием Cannot find dispatch method for {}derp.

Возможно ли даже создать общий / тупой веб-сервис, который будетACK все с JAX-WS?Если так, может ли кто-нибудь указать мне правильное направление?


РЕДАКТИРОВАТЬ Благодаря совету от Макдауэлла я смог сделать это с помощью SOAPHandler:

public class DummySOAPHandler implements SOAPHandler {

    @Override
    public boolean handleMessage(MessageContext context) {
        return process((SOAPMessageContext) context);
    }

    @Override
    public boolean handleFault(MessageContext context) {
        return process((SOAPMessageContext) context);
    }

    @Override
    public void close(MessageContext context) { }

    @Override
    public Set<QName> getHeaders() {
        return null;
    }

    private boolean process(SOAPMessageContext ctx) {

        try {
            SOAPMessage message = ctx.getMessage();
            SOAPEnvelope envelope = message.getSOAPPart().getEnvelope();
            SOAPBody body = message.getSOAPBody();

            if ((Boolean) ctx.get (MessageContext.MESSAGE_OUTBOUND_PROPERTY)) {
                Iterator<SOAPElement> bodyChildren = body.getChildElements();
                while (bodyChildren.hasNext()) {
                    SOAPElement child = bodyChildren.next();
                    child.detachNode();
                }

                body.addBodyElement(envelope.createName("OK"));
                message.saveChanges();
            }
        } catch (SOAPException e) {
            e.printStackTrace();
        }

        return true;
    }
}

1 Ответ

1 голос
/ 12 августа 2011

Я ожидаю, что ваша служба ожидает что-то вроде:

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
                  xmlns:dum="http://yournamespace/">
  <soapenv:Header/>
  <soapenv:Body>
    <dum:processMessage>
     <!-- xsd:anyType -->
    </dum:processMessage>
  </soapenv:Body>
</soapenv:Envelope>

Добавьте ?WSDL к конечной точке и проверьте тип входного XML-данных операции и пространства имен.

Возможно, вы сможете что-то сделать с логическим обработчиком ( javadoc ) для преобразования входящего запроса в эту форму - я не пробовал.

...