With web services at times one needs to know the name of the method (operation) being invoked before it is really invoked. A typical scenario is the authorization, where access to method is restricted to certain roles only. The JAX-WS RI 2.0 used to hold the name of the operation being invoked in SOAPMessageContext, which can be obtained in following manner-
soapMessageContext.get(MessageContext.WSDL_OPERATION);
Unfortunately JAX-WS RI 2.1.x no longer have this information and JAX-WS team is not ready to provide it as they said this is optional. Then what is the workaround when someone really needs it? Looking for clues I ran JAX-WS RI 2.1.5 code in Eclispe debugger and found operation name in non-public classes / variables as shown in the following screenshot-
Now equipped with this information operation name can be extracted using reflection API-
private String getMethodName(SOAPMessageContext context, boolean isRequest) { try { Field field = context.getClass().getSuperclass().getDeclaredField( "packet"); field.setAccessible(true); Packet packet = (Packet) field.get(context); if (isRequest) return ((StreamMessage) packet.getMessage()) .getPayloadLocalPart(); return ((JAXBMessage) packet.getMessage()).getPayloadLocalPart(); } catch (Exception e) { e.printStackTrace(); } return null; }Though this is not a clean way and may not work with future releases of JAX-WS RI but works for now :-)