Получение мыльного сообщения без вызова веб-службы - PullRequest
4 голосов
/ 18 апреля 2011

Используя реализацию Glassfish Metro спецификации JAX-WS, можно генерировать сообщение-запрос SOAP для конкретной операции, фактически не вызывая ее. Что-то вроде способности SOAPUI генерировать пример сообщения SOAP на основе только WSDL, что я хотел бы сгенерировать, предоставляя параметры для работы.

Спасибо.

Ответы [ 2 ]

1 голос
/ 18 апреля 2011

OK.Я думаю, что у меня это есть.Это не красиво и не чисто, так как использует отражение, основано на проприетарных классах Oracle и предполагает, что вы уже создали свою WS-часть на стороне клиента, но если вам нужны такие функциональные возможности, как у меня, когда крайний срок приближается к неизбежному, каксама смерть тогда услышит мой рассказ:)

// location of wsdl file provided in URL format
// ex. file://localhost/C:/wsdl.wsdl for local file
String wsdlLocation = "wsdlLocation";

try{
    // we're assuming that you've already generated WS client side
    GeneratedService service = new GeneratedService(
        new URL(wsdlLocation),
        new QName("namespaceURI", "localPart"));

    GeneratedPort port = service.getGeneratedPort();

    SEIStub stub = (SEIStub) Proxy.getInvocationHandler(port);

    Field methodHandlersField =
        stub.getClass().getDeclaredField("methodHandlers");
    //hack to make private field accessible
    methodHandlersField.setAccessible(true);

    Method operationMethod = null;
    Object args = null;

    switch (somethingToTellYouWhatMethodToInvoke){
        case someMethodValue:
            operationMethod = GeneratedPort.class.getMethod(
                "methodName", classes, of, your, attributes);
            args = new Object[]{attributes, of, your, method};
            break;
        default:
            throw new SomeException("some message");
            break;
    }

    MethodHandler handler = ((Map<Method, MethodHandler>) methodHandlersField.
        get(stub)).get(operationMethod);

    Method createMessageMethod = handler.getClass().getSuperclass().
        getDeclaredMethod("createRequestMessage", Object[].class);
    //another hack
    createMessageMethod.setAccessible(true);

    Message message = (Message) createMessageMethod.invoke(handler, args);

    Transformer transformer =
        TransformerFactory.newInstance().newTransformer();
    transformer.setOutputProperty(OutputKeys.INDENT, "yes");
    transformer.setOutputProperty(
        "{http://xml.apache.org/xslt}indent-amount", "2");
    transformer.transform(
        message.readPayloadAsSource(), new StreamResult(System.out));
} catch (Exception e){
    //lots of things to catch
    e.printStackTrace();
}

Итак, еще раз, это очень плохое решение, но пока какой-то тяжелый мыслитель не придет и не спасет мой день с чем-то лучшим, или Sun не переместит занятия, мне нужно более дружелюбное предложениедостаточно.

0 голосов
/ 18 апреля 2011

Сделай сам: Укажи клиенту страницу PHP, которая выводит полезную нагрузку.Запустите клиент.Он не сможет прочитать ответ, но запрос будет сохранен.

...