1. ホーム
  2. validation

[解決済み] JAX-WSによるサーバーサイドのスキーマ検証

2022-03-07 12:32:35

質問

JAX-WSのコンテナレス・サービス( Endpoint.publish() から main() メソッド) を使用します。入力されたメッセージを検証するサービスを作りたいのですが。以下のアノテーションを試してみました。 @SchemaValidation(handler=MyErrorHandler.class) を作成し、適切なクラスを実装しました。サービスを起動すると、以下のようになります。

Exception in thread "main" javax.xml.ws.WebServiceException: 
Annotation @com.sun.xml.internal.ws.developer.SchemaValidation(outbound=true,
inbound=true, handler=class mypackage.MyErrorHandler) is not recognizable, 
atleast one constructor of class 
com.sun.xml.internal.ws.developer.SchemaValidationFeature 
should be marked with @FeatureConstructor

私が見つけたのは いくつかの解決策 インターネット上では、そのすべてがWebLogicコンテナの使用を暗示しています。私の場合、コンテナを使用することができないので、埋め込みサービスが必要です。それでもスキーマ検証を使用することはできますか?

どのように解決するのですか?

その @SchemaValidation アノテーションはJAX-WS仕様で定義されておらず、検証はオープンなままになっています。これは、jdk に含まれるクラスだけでなく、それ以上のものが必要であることを意味します。

クラスパスにjarを追加できるのであれば、metro(WebLogicにも含まれています)を使ってかなり簡単に設定できます。これが、WebLogicをコンテナとして使用するソリューションを見つける理由です)。より正確には、クラスパスに2つのjarを追加する必要があります。私は次のように提案します。

  1. ダウンロード 最新のメトロ・リリース .
  2. どこかで解凍してください。
  3. を追加します。 jaxb-api.jarjaxws-api.jar をクラスパスに追加します。これを行うには、たとえばこれらを JAVA_HOME/lib/endorsed または手動でプロジェクトに追加してください。これは、あなたが使っている IDE や何かに大きく依存します。

これができたら、あなたの MyErrorHandler を介してデプロイされても動作するはずです。 Endpoint.publish() . 少なくとも、私はこの設定をローカルで行い、コンパイルして動作しています。

クラスパスを変更することができず、検証が必要な場合は、JAXBを使用して手動でリクエストを検証する必要があります。