4

サーバー側でJersey 1.17を使用してRESTリクエストを処理し、JAXB 2を使用してXMLリクエストコンテンツをアンマーシャリングしています。

環境

これは私が使用するジャージー方式です。MyDTOクラスは@XmlRootElementアノテーションを使用します (それ以外の場合は、JAXBElement タイプでパラメーターを定義する必要があります)。

 @Path("/myService")
 @POST
 @Consumes(MediaType.APPLICATION_XML)
 public void myService(MyDTO dto) throws Exception
 {              
    // Shouldn't get this far if the XML content in the request was invalid
    System.out.println(dto);
 }

要件

デフォルトでは、XML コンテンツにエラーがある場合、Sun/Oracle JAXB 実装は例外をスローしません。たとえば、整数属性に ABC などの文字列値を指定すると、例外がスローされるのではなく、単に値が null のままになります。

JAXB 2 では、ValidationEvenHandler を定義できます。次のハンドラー ハンドラーを使用すると、XML アンマーシャリングが必要な方法で例外をスローします。

public class UnmarshallerValidationEventHandler implements ValidationEventHandler {

        @Override
        public boolean handleEvent(ValidationEvent event) {
            // This indicates JAXB that it should continue processing only if the
            // severity level is less than error. NOTE: validation event constants
            // go in ascending order in level of severity(i.e., 0 WARNING, 1: ERROR, 2 :FATAL_ERROR)
            return event.getSeverity() < ValidationEvent.ERROR;
        }

    }

質問

カスタム検証イベント ハンドラーでアンマーシャラーを使用するために、Jersey に特定の JAXBContext インスタンスを使用させるにはどうすればよいですか?

または、アプリケーションがジャージー メソッドで JAXB のみを使用していることを考えると、JVM インスタンスに対して特定の JAXBContext をグローバルに定義することは適切なオプションです。どうすればそれができますか?

4

1 に答える 1

3

Jersey ユーザーズガイドでは、カスタム JAXBContext の使用の章でこれについて説明しています。基本的に、次のようなContextResolver<T>を提供する必要があります。

@Provider
public class PlanetJAXBContextProvider implements ContextResolver<JAXBContext> {
    private JAXBContext context = null;

    public JAXBContext getContext(Class<?> type) {
        if(type != Planet.class)
            return null; // we don't support nothing else than Planet

        if(context == null) {
            try {
                context = JAXBContext.newInstance(Planet.class);
            } catch (JAXBException e) {
                // log warning/error; null will be returned which indicates that this
                // provider won't/can't be used.
            }
        }
        return context;
    }
}

storage-serviceサンプル プロジェクトで使用例を確認できます( JAXBContextResolverを参照)。

注:代わりにor/andContextResolver<JAXBContext>を指定することもできます。ContextResolver<Marshaller>ContextResolver<Unmarshaller>

于 2013-08-26T08:00:57.423 に答える