116

私はWebサービスの世界に比較的慣れていませんが、私の研究は私を啓発するよりも混乱させているようです.私の問題は、いくつかのWebサービス機能で拡張する必要があるライブラリ(jar)が与えられたことです.

このライブラリは他の開発者に共有され、jar 内のクラスの中には、Web サービスを呼び出すメソッドを持つクラスがあります (これは、基本的にクラスの属性を設定し、オブジェクトをデータベースに格納するなど、いくつかのビジネス ロジックを実行します。などを変更し、それらの変更を加えてオブジェクトを送り返します)。私はこのサービスの呼び出しをできるだけ単純にしたいと考えています。できれば、このクラスを使用する開発者だけが行う必要があるように、できるだけ単純にしたいと考えています。

Car c = new Car("Blue");
c.webmethod();

wsimportサーバーで使用する JAX-WS を研究していますが、サーバーにもクライアントにもを作成する必要はないように思えますwsimport。どちらにもクラスがあることがわかっているので、クラス間の相互作用が必要なだけです。サーバーとクライアントの両方で共有されます。クラスで Web サービスと呼び出しを行うのはどのように理にかなっていると思いますか?

4

4 に答える 4

3

または、Apache CXF の wsdl2javaを使用して、使用できるオブジェクトを生成します。

Web サイトからダウンロードできるバイナリ パッケージに含まれています。次のようなコマンドを実行するだけです。

$ ./wsdl2java -p com.mynamespace.for.the.api.objects -autoNameResolution http://www.someurl.com/DefaultWebService?wsdl

wsdl を使用してオブジェクトを生成します。これは次のように使用できます(オブジェクト名も wsdl から取得されるため、あなたのものは少し異なります)。

DefaultWebService defaultWebService = new DefaultWebService();
String res = defaultWebService.getDefaultWebServiceHttpSoap11Endpoint().login("webservice","dadsadasdasd");
System.out.println(res);

ソースを生成する Maven プラグインもあります: https://cxf.apache.org/docs/maven-cxf-codegen-plugin-wsdl-to-java.html

注: CXF と IDEA を使用してソースを生成する場合は、https ://stackoverflow.com/a/46812593/840315 を参照してください。

于 2016-11-18T14:32:56.887 に答える
1

石鹸メッセージを生成するためのはるかに簡単な代替方法を見つけました。Person オブジェクトが与えられた場合:

import com.fasterxml.jackson.annotation.JsonInclude;

@JsonInclude(JsonInclude.Include.NON_NULL)
public class Person {
  private String name;
  private int age;
  private String address; //setter and getters below
}

以下は、単純な SOAP メッセージ ジェネレータです。

import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializationFeature;
import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import com.fasterxml.jackson.dataformat.xml.XmlMapper;

@Slf4j
public class SoapGenerator {

  protected static final ObjectMapper XML_MAPPER = new XmlMapper()
      .enable(DeserializationFeature.READ_UNKNOWN_ENUM_VALUES_AS_NULL)
      .configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false)
      .configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false)
      .registerModule(new JavaTimeModule());

  private static final String SOAP_BODY_OPEN = "<soap:Body>";
  private static final String SOAP_BODY_CLOSE = "</soap:Body>";
  private static final String SOAP_ENVELOPE_OPEN = "<soap:Envelope xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\">";
  private static final String SOAP_ENVELOPE_CLOSE = "</soap:Envelope>";

  public static String soapWrap(String xml) {
    return SOAP_ENVELOPE_OPEN + SOAP_BODY_OPEN + xml + SOAP_BODY_CLOSE + SOAP_ENVELOPE_CLOSE;
  }

  public static String soapUnwrap(String xml) {
    return StringUtils.substringBetween(xml, SOAP_BODY_OPEN, SOAP_BODY_CLOSE);
  }
}

次の方法で使用できます。

 public static void main(String[] args) throws Exception{
        Person p = new Person();
        p.setName("Test");
        p.setAge(12);

        String xml = SoapGenerator.soapWrap(XML_MAPPER.writeValueAsString(p));
        log.info("Generated String");
        log.info(xml);
      }
于 2018-12-13T01:34:58.187 に答える