1

私は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 コンテナーの使用を暗示しています。私の場合、コンテナを使用できません。埋め込みサービスが必要です。引き続きスキーマ検証を使用できますか?

4

2 に答える 2

4

@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 を使用して手動でリクエストを検証する必要があります。

于 2013-02-04T13:53:48.017 に答える
3

古い質問ですが、正しいパッケージと最小限の構成を使用し、WebLogic から提供されるサービスのみを使用して問題を解決しました。私はあなたと同じ問題にぶつかっていました。

here で説明したように、正しい Java タイプを使用していることを確認してください。

追跡メカニズムへの拡張を計画しているため、カスタム エラー ハンドラも実装しました。

カスタム検証ハンドラを持つ Web サービス

import com.sun.xml.ws.developer.SchemaValidation;

@Stateless
@WebService(portName="ValidatedService")
@SchemaValidation(handler=MyValidator.class)
public class ValidatedService {

    public ValidatedResponse operation(@WebParam(name = "ValidatedRequest") ValidatedRequest request) {

        /* do business logic */

        return response;
    }
}

エラーをログに記録してデータベースに保存するカスタム ハンドラ

public class MyValidator extends ValidationErrorHandler{

    private static java.util.logging.Logger log = LoggingHelper.getServerLogger();

    @Override
    public void warning(SAXParseException exception) throws SAXException {
        handleException(exception);
    }

    @Override
    public void error(SAXParseException exception) throws SAXException {
        handleException(exception);
    }

    @Override
    public void fatalError(SAXParseException exception) throws SAXException {
        handleException(exception);
    }

    private void handleException(SAXParseException e) throws SAXException {
        log.log(Level.SEVERE, "Validation error", e);
        // Record in database for tracking etc
        throw e;
    }
}
于 2015-01-21T15:26:11.180 に答える