Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Решение проблемы с вызовом Java веб-сервиса из Delphi 2010: от RPC/Literal к Document/Literal/Wrapped

Delphi , Программа и Интерфейс , Процессы и Сервисы

Решение проблемы с вызовом Java веб-сервиса из Delphi 2010

При вызове Java веб-сервиса из среды Delphi 2010 разработчики могут столкнуться с проблемами, особенно когда речь идет о передаче сложных типов данных. Вопрос, поднятый пользователем, заключается в том, что при использовании примитивных типов данных (например, строк и целых чисел) все работает корректно. Однако при передаче объектов в качестве параметров Java методы получают null, что указывает на проблему с каркасом данных между клиентом и сервером.

Описание проблемы

Пользователь столкнулся с проблемой при вызове веб-сервиса на Java из приложения на Delphi 2010. Все работает корректно, когда в качестве параметров используются примитивные типы данных. Но при передаче сложных типов данных (объектов) сервер Java получает null и, как следствие, возникает исключение, так как ожидается не пустой объект, а реальные данные.

Контекст проблемы

Java интерфейс веб-сервиса использует стиль RPC/Literal, что является причиной проблемы. При импорте WSDL в Delphi, используется стиль SOAP-Encoded SOAP 1.1 Envelope с MultiRef, который не совместим с RPC/Literal стилем веб-сервиса Java.

Пример кода

Java интерфейс веб-сервиса:

@WebService(name="TestService", targetNamespace=CNAPBackOffice.NAMESPACE_SERVICES)
@SOAPBinding(style=SOAPBinding.Style.RPC, use=SOAPBinding.Use.LITERAL)
public interface TestService {
    @WebMethod(operationName="sendComplexType")
    @WebResult(name="okString")
    public String sendComplexType(TestData data);
}

Класс реализации веб-сервиса:

@WebService(endpointInterface = "lu.ciss.backoffice.cnap.services.TestService",
        portName = "TestEndpoint", serviceName = "TestService",
        targetNamespace = CNAPBackOffice.NAMESPACE_SERVICES)
public class TestServiceImpl implements TestService {
    @Override
    public String sendComplexType(TestData data) {
        return data.getTestString();
    }
}

Класс TestData:

public class TestData {
    String testString;
    // ... + Setter/Getter для testString
}

Пример вызова веб-сервиса из Delphi:

procedure TFRM_Test.TestClick(Sender: TObject);
var
    Service: TestService;
    data: TestData;
    result: String;
begin
    Service := GetTestService(true);
    data := TestData.Create;
    data.testString := 'Bla';
    result := Service.sendComplexType(data);
    ShowMessage(result);
end;

SOAP запрос, генерируемый Delphi, содержит ссылки и некорректно форматированные данные, что приводит к ошибке на стороне Java.

Подтвержденное решение

Изменить стиль связывания в Java интерфейсе веб-сервиса на Document/Literal/Wrapped:

@SOAPBinding(style=SOAPBinding.Style.DOCUMENT, use=SOAPBinding.Use.LITERAL, parameterStyle = ParameterStyle.WRAPPED)

Это позволит Delphi корректно импортировать WSDL и выполнить вызов веб-сервиса с передачей сложных типов данных.

Альтернативный ответ

В качестве альтернативы можно попробовать настроить опции импорта WSDL в Delphi, однако предпочтительным решением является изменение стиля связывания в Java интерфейсе веб-сервиса.

Выводы

При вызове Java веб-сервиса из Delphi важно учитывать стиль связывания, используемый в Java интерфейсе. В случае несоответствия стилей, необходимо внести изменения в Java код, чтобы обеспечить корректный обмен данными между клиентом и сервером.

Создано по материалам из источника по ссылке.

Проблема заключается в несоответствии стиля каркаса данных между клиентом (Delphi 2010) и сервером (Java веб-сервис), вызванном различием в использовании стилей RPC/Literal и SOAP-Encoded SOAP 1.1 Envelope с MultiRef, что приводит к тому, что сложные тип


Комментарии и вопросы

Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: Процессы и Сервисы ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-12-22 20:14:06
2025-06-16 16:25:36/0.0031688213348389/0