2017-07-11 6 views
1

examples that I've foundunmarshallerオブジェクトで検証ハンドラを設定する方法について説明します。JerseyのMoxyでValidationEventHandlerを登録するには?

しかし、Jerseyを使用すると、MOXy/JAXBが初期化され、アンマーシャラーにアクセスする方法がわかりません。

現在、このようなジャージをブートストラップしており、jersey-media-moxyがクラスパス上にあります。このアプローチで

@ApplicationPath("rest") 
public class ApplicationConfig extends ResourceConfig { 
    Logger logger = LoggerFactory.getLogger(ApplicationConfig.class); 

    public ApplicationConfig() { 
     // Scan classes in this package and subpackages 
     logger.info("Registering REST Application"); 
     packages("rest"); 
     register(new AbstractBinder() { 
      @Override 
      protected void configure() { 
       // used to automatically inject a Connection instance and close it 
       bindFactory(ConnectionFactory.class).to(Connection.class) 
         .proxy(true).proxyForSameScope(false).in(RequestScoped.class); 
      } 
     }); 


    } 
} 

、どのように私はアンマーシャラーにValidationEventHandlerを登録することができますか?

答えて

1

これは、これを行うには正しい方法(私はそれをやったことがない)である場合、私は知らないが、いくつかの周りに掘っthe source codeやって、あなただけのConfigurableMoxyJsonProviderを拡張し、preReadFromをオーバーライドすることができます。

これは他の方法では実行できません。前述のクラスは、MoxyJsonProviderに拡張されています。 Unmarahsallerが作成されたときにreadFromに表示されますが、それほど多くのことはできません。あなたができることは、外部からプロパティを設定することだけです。しかし、あなたに実際のUnmarshallerへのアクセスを与えるものは何もありません。プロバイダを拡張するためにアクセスする唯一の方法です

おそらく、デフォルトのMOXyプロバイダーも無効にする必要があります。あなたは無効にするかもしれないものを心配している場合の例

@Consumes("application/json") 
@Produces("application/json") 
public class ValidatingMoxyProvider extends ConfigurableMoxyJsonProvider { 
    private final ValidationEventHandler handler = event -> { 
     System.out.println(event.getLinkedException()); 
     System.out.println(event.getMessage()); 
     return false; 
    }; 

    @Override 
    protected void preReadFrom(final Class<Object> type, 
           final Type genericType, 
           final Annotation[] annotations, 
           final MediaType mediaType, 
           final MultivaluedMap<String, String> httpHeaders, 
           final Unmarshaller unmarshaller) throws JAXBException { 
     super.preReadFrom(type, genericType, annotations, 
          mediaType, httpHeaders, unmarshaller); 
     unmarshaller.setEventHandler(handler); 
    } 
} 

public ApplicationConfig() { 
    register(ValidatingMoxyProvider.class); 
    property(ServerProperties.MOXY_JSON_FEATURE_DISABLE, true); 
} 

について、ちょうどsource for the MoxyJsonFeatureを見てください。 entity filtering feature

を使用していない限り、あなたは本当に何かを見逃すことはありません
関連する問題