Nano Hash - криптовалюты, майнинг, программирование

Веб-сервис Java CFX и Delphi 2010

Я борюсь с некоторыми проблемами, вызывающими мой веб-сервис Java. Пока я использую примитивные типы данных, такие как строки, целые числа и т. д., все работает нормально.

Но когда я пытаюсь использовать объекты в качестве параметров, мои java-методы получают только null. Таким образом, отображение не работает. Привожу простой пример:

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);
}

Java-реализация

@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 for testString
}

Я использую сгенерированный WSDL для импорта его в Delphi с помощью меню «Компонент->Импорт WSDL...». После этого я вызываю веб-сервис следующим образом:

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;

Как я уже говорил, сторона Java получает null, что в данном случае вызывает исключение en. Таким образом, очевидно, что отображение между двумя мирами работает неправильно. Я пытался изменить различные параметры в меню импорта WSDL, но, похоже, ничего не работает. Я взглянул на SOAP-запрос, запущенный Delphi:

<?xml version="1.0"?>
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/">
    <SOAP-ENV:Body SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" xmlns:NS2="http://cnap.backoffice.ciss.lu/services">
        <NS1:sendComplexType xmlns:NS1="http://cnap.backoffice.ciss.lu/services">
            <arg0 href="#1"/>
        </NS1:sendComplexType>

        <NS2:testData id="1" xsi:type="NS2:testData">
            <testString xsi:type="xsd:string">Bla</testString>
        </NS2:testData>
    </SOAP-ENV:Body>
</SOAP-ENV:Envelope>

Я никогда раньше не видел этого странного понятия ссылок. Может ли это вызвать проблемы? Или у кого-то есть другая идея или даже лучше: решение :)

Заранее спасибо.

P.S. Вот сгенерированный WSDL:

<?xml version="1.0" ?><wsdl:definitions name="TestService" targetNamespace="http://cnap.backoffice.ciss.lu/services" xmlns:ns1="http://schemas.xmlsoap.org/soap/http" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:tns="http://cnap.backoffice.ciss.lu/services" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <wsdl:types>
<xs:schema targetNamespace="http://cnap.backoffice.ciss.lu/services" version="1.0" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:complexType name="testData">
    <xs:sequence>
      <xs:element minOccurs="0" name="testString" type="xs:string"></xs:element>
    </xs:sequence>
  </xs:complexType>
</xs:schema>
  </wsdl:types>
  <wsdl:message name="sendComplexType">
    <wsdl:part name="arg0" type="tns:testData">
    </wsdl:part>
  </wsdl:message>
  <wsdl:message name="sendComplexTypeResponse">
    <wsdl:part name="okString" type="xsd:string">
    </wsdl:part>
  </wsdl:message>
  <wsdl:portType name="TestService">
    <wsdl:operation name="sendComplexType">
      <wsdl:input message="tns:sendComplexType" name="sendComplexType">
    </wsdl:input>
      <wsdl:output message="tns:sendComplexTypeResponse" name="sendComplexTypeResponse">
    </wsdl:output>
    </wsdl:operation>
  </wsdl:portType>
  <wsdl:binding name="TestServiceSoapBinding" type="tns:TestService">
    <soap:binding style="rpc" transport="http://schemas.xmlsoap.org/soap/http"></soap:binding>
    <wsdl:operation name="sendComplexType">
      <soap:operation soapAction="" style="rpc"></soap:operation>
      <wsdl:input name="sendComplexType">
        <soap:body namespace="http://cnap.backoffice.ciss.lu/services" use="literal"></soap:body>
      </wsdl:input>
      <wsdl:output name="sendComplexTypeResponse">
        <soap:body namespace="http://cnap.backoffice.ciss.lu/services" use="literal"></soap:body>
      </wsdl:output>
    </wsdl:operation>
  </wsdl:binding>
  <wsdl:service name="TestService">
    <wsdl:port binding="tns:TestServiceSoapBinding" name="TestEndpoint">
      <soap:address location="http://localhost:7777/CNAP_BackOffice/services/TestService"></soap:address>
    </wsdl:port>
  </wsdl:service>
</wsdl:definitions>

Ответы:


1

Это вина Делфи.

Ваш аннотированный интерфейс JSR-181/JSR-224 имеет явный @SOAPBinding(style=SOAPBinding.Style.RPC, use=SOAPBinding.Use.LITERAL), и ваш сгенерированный WSDL ясно указывает, что это RPC/Literal WebService

  <wsdl:binding name="TestServiceSoapBinding" type="tns:TestService">
    <soap:binding style="rpc" transport="http://schemas.xmlsoap.org/soap/http"></soap:binding>
    <wsdl:operation name="sendComplexType">
      <soap:operation soapAction="" style="rpc"></soap:operation>
      <wsdl:input name="sendComplexType">
        <soap:body namespace="http://cnap.backoffice.ciss.lu/services" use="literal"></soap:body>
      </wsdl:input>

Однако Delphi создала конверт SOAP 1.1 с кодировкой Soap-Encoded со значениями MultiRef и указала его с помощью SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/".

Итак, вам нужно настроить некоторые параметры в Delphi...

Может быть, Delphi не может импортировать RPC/Literal? Попробуйте переключиться на Document/Literal/Wrapped:

@SOAPBinding(style=SOAPBinding.Style.DOCUMENT, use=SOAPBinding.Use.LITERAL, parameterStyle = ParameterStyle.WRAPPED)
20.12.2012
  • Идеальный. Я только что попробовал, как вы предложили, переключившись на Document/Literal/Wrapped, и это работает. 20.12.2012
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

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

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..