JAX-WS RI: лучший способ реализовать метод-перехватчик - PullRequest
1 голос
/ 14 июня 2011

Я хочу предоставить свой собственный метод-перехватчик для моих вызовов веб-сервиса. По сути, этот метод-перехватчик должен вызываться непосредственно перед , когда вызывается реальный метод ... См. Фрагмент ниже:

public class MyMethodInterceptor {
  public Object invoke(Object t, Method m, Object[] args) throws Throwable {
    // do some magic, such as tracing, authorise, etc...
    return m.invoke(t, args);
  }     
}

// ....    

public class MyWebServiceImpl implements MyWebServiceInterface {
  public String greet(final String name) {
    return "Hi there, " + name;
  }
}

Идея состоит в том, что каждый раз, когда веб-сервис вызывается, он будет передаваться через мой перехватчик. Я смотрел, как подключить свой собственный InstanceResolver, но он выходит из-под контроля. Я знаю, как сделать это в CXF и с JAX-RS (Джерси) + Guice.

JAX-WS предоставляет handler-chains, но эти обработчики вызываются слишком рано (т. Е. Задолго до вызова метода), поэтому у меня нет необходимой информации на данный момент.

Каков наилучший способ сделать это с помощью Референовой реализации JAX-WS?

1 Ответ

0 голосов
/ 14 июня 2011

В обработчике jax-ws вы находитесь прямо перед реальной вещью, у вас есть доступ к содержимому всего сообщения SOAP, что вам нужно, что еще не доступно?Несколько примеров для использования в обработчике:

public String getMessage(SOAPMessageContext smc) {
    SOAPMessage message = smc.getMessage();
    ByteArrayOutputStream soapEnvelope = new ByteArrayOutputStream();
    message.writeTo(soapEnvelope);
    soapEnvelope.close();
    return new String(soapEnvelope.toByteArray());
}

public String getMethod(SOAPMessageContext smc) {
    SOAPMessage message = smc.getMessage();
    SOAPBody body = message.getSOAPBody();
    return body.getFirstChild().getLocalName();
}
...