2017-07-11 34 views
1

examples that I've found討論瞭如何在unmarshaller對象上設置驗證處理程序。如何在Jersey中使用Moxy註冊ValidationEventHandler?

但是,使用Jersey,MOXy/JAXB爲我初始化,我不知道如何訪問unmarshaller。

目前,我像這樣引導Jersey,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。你可以在readFrom中看到,當Unmarahsaller被創建時,你可以用它做很多事情。你所能做的就是從外面設置屬性。但沒有什麼能讓你訪問實際的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

你不會錯過任何東西
相關問題