ホームページ  >  記事  >  Java  >  CXFをJavaと統合してWebサービス開発を完了する例の詳細な説明

CXFをJavaと統合してWebサービス開発を完了する例の詳細な説明

Y2J
Y2Jオリジナル
2017-05-12 09:54:511818ブラウズ

この記事では主に Spring Boot に CXF を組み込んで Web サービスを開発する例を紹介していますが、編集者が非常に良いと思ったので、参考として共有します。編集者をフォローして見てみましょう

前書き

Web サービスと言えば、RESTful は近年非常に人気があり、従来の SOAP Web サービスに取って代わる傾向にありますが、一部の独自のシステムや比較的古いシステムでは依然として使用されています。銀行や航空券の問い合わせインターフェースなどの従来の Web サービス。

現在、この状況に遭遇しています。システム内のサードパーティが提供する SOAP Web サービス インターフェイスをクエリする必要があります。これは、既存のシステムに統合することを意味します。

CXFをSpringに統合するのは非常に簡単ですが、Spring Bootを使用しているため、以前のXML構成方法を使用したくないので、Spring Bootスタイルに従ってエレガントに統合できますか?

答えはもちろんそうですが、ネット上にはこれに関する情報がほとんどなく、非常に簡単なようですが、記録する必要があると感じています。

依存関係を追加する

Maven プロジェクトの場合、最初のステップはもちろん元の Spring Boot 依存関係に加えて、cxf 依存関係も追加する必要があります:

<dependency>
  <groupId>org.apache.cxf</groupId>
  <artifactId>cxf-rt-frontend-jaxws</artifactId>
  <version>3.1.6</version>
</dependency>
<dependency>
  <groupId>org.apache.cxf</groupId>
  <artifactId>cxf-rt-transports-http</artifactId>
  <version>3.1.6</version>
</dependency>

ビジネス コードを書きます

ここに。ユーザー情報をクエリします。 たとえば、カスタム User オブジェクト を作成します。

public class User implements Serializable {
  private static final long serialVersionUID = -5939599230753662529L;
  private Long       userId;
  private String      username;
  private String      email;
  private Date       gmtCreate;
  //getter setter ......
}

次に、Web サービス サービスを提供するためのユーザー インターフェイスを作成します getNamegetUser 1 つは通常の String を返し、もう 1 つはカスタム オブジェクトを返します。

@WebService
public interface UserService {
  @WebMethod
  String getName(@WebParam(name = "userId") Long userId);
  @WebMethod
  User getUser(Long userId);
}

もちろん、インターフェイスがある場合は、ビジネス コードで実装する必要があります。ここでは簡単なデモのみを行います:

public class UserServiceImpl implements UserService {
  private Map<Long, User> userMap = new HashMap<Long, User>();
  public UserServiceImpl() {
    User user = new User();
    user.setUserId(10001L);
    user.setUsername("liyd1");
    user.setEmail("liyd1@qq.com");
    user.setGmtCreate(new Date());
    userMap.put(user.getUserId(), user);
    user = new User();
    user.setUserId(10002L);
    user.setUsername("liyd2");
    user.setEmail("liyd2@qq.com");
    user.setGmtCreate(new Date());
    userMap.put(user.getUserId(), user);
    user = new User();
    user.setUserId(10003L);
    user.setUsername("liyd3");
    user.setEmail("liyd3@qq.com");
    user.setGmtCreate(new Date());
    userMap.put(user.getUserId(), user);
  }
  @Override
  public String getName(Long userId) {
    return "liyd-" + userId;
  }
  @Override
  public User getUser(Long userId) {
    return userMap.get(userId);
  }
}

サービスの公開

残っているのは、インターフェイスとビジネス コードの作成です。サービス、つまり Spring Boot と cxf の統合を公開します。

実際、この 2 つの統合は非常に簡単で、以前の XML メソッドよりも簡潔です。関連するすべてのコードは次のとおりです:

@Configuration
public class CxfConfig {
  @Bean
  public ServletRegistrationBean dispatcherServlet() {
    return new ServletRegistrationBean(new CXFServlet(), "/soap/*");
  }
  @Bean(name = Bus.DEFAULT_BUS_ID)
  public SpringBus springBus() {
    return new SpringBus();
  }
  @Bean
  public UserService userService() {
    return new UserServiceImpl();
  }
  @Bean
  public Endpoint endpoint() {
    EndpointImpl endpoint = new EndpointImpl(springBus(), userService());
    endpoint.publish("/user");
    return endpoint;
  }
}

cxf の構成からサービスの公開まで、1 つまたは 2 つのみであることがわかります。必要なコード行は驚くほど簡単ですよね。

これですべての操作が完了しました。 Spring Boot を起動し、localhost:8080/soap/user?wsdl にアクセスします

関連する wsdl 記述情報が出力され、サービスがリリースされたことがわかります。

サービスを呼び出す

Web サービスがリリースされました。たとえば、いくつかのサードパーティ インターフェイスを統合する場合、最初に呼び出してからリリースする必要がありますか?

SOAP Web サービスを呼び出すには、wsdl に基づいてクライアント コードを生成する方法が一般的で、統合後はローカル インターフェイスを呼び出すように使用できます。

しかし、私は個人的にこの方法があまり好きではありません。各インターフェイスを一度生成する必要があり、コードが大量にあるため、面倒に感じます。

比較的、すっきりしていて簡潔なメソッド名を呼び出す方法が好まれます。これがすべてのコードです:

JaxWsDynamicClientFactory dcf = JaxWsDynamicClientFactory.newInstance();
Client client = dcf.createClient("http://localhost:8080/soap/user?wsdl");
Object[] objects = client.invoke("getUser", 10002L);
//输出调用结果
System.out.println(objects[0].getClass());
System.out.println(objects[0].toString());

このメソッドで注意すべき点は、呼び出されたサービス インターフェイスがカスタム オブジェクトを返す場合、結果はObject[] の

データ型 はこのカスタム オブジェクトになります (コンポーネントがこのオブジェクトを自動的に生成します)。

ただし、このクラスがローカルにない可能性があるため、自分で変換する必要があります。最も簡単な方法は、新しいクラスを作成することです。もちろん、より良い方法は、返された結果とまったく同じクラスを強制的に転送することです。もちろん、より良い方法は、一般的なクラスをカプセル化することです。これはこの記事の主題ではないため、説明しません。ここで詳しく説明します。

【関連する推奨事項】

1.

無料の Java ビデオチュートリアル

2.

Java アノテーションの包括的な分析

以上がCXFをJavaと統合してWebサービス開発を完了する例の詳細な説明の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。