2017-07-11 4 views
1

Le examples that I've found parle de la définition du gestionnaire de validation sur un objet unmarshaller. Cependant, en utilisant Jersey, MOXy/JAXB est initialisé pour moi et je ne sais pas comment accéder au unmarshaller.Comment enregistrer un ValidationEventHandler avec Moxy dans Jersey?

Actuellement, je bootstrap Jersey comme ceci, avec jersey-media-moxy étant sur le classpath.

@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); 
      } 
     }); 


    } 
} 

Avec cette approche, comment puis-je enregistrer un ValidationEventHandler sur le unmarshaller?

Répondre

1

Je ne sais pas si cela est la bonne façon de le faire (je l'ai jamais fait), mais faire un peu de creuser autour the source code, vous pouvez simplement étendre le ConfigurableMoxyJsonProvider et remplacer le preReadFrom.

Je ne vois pas d'autre moyen de le faire. La classe précédente mentionnée s'étend à MoxyJsonProvider. Vous pouvez voir dans le readFrom, lorsque le Unmarahsaller est créé, il n'y a pas vraiment beaucoup à faire avec. Tout ce que vous pouvez faire est de définir les propriétés de l'extérieur. Mais rien qui vous donne accès à la réelle Unmarshaller. Alors peut-être la seule façon d'y accéder pour simplement étendre le fournisseur.

Vous devrez probablement également désactiver le fournisseur MOXy par défaut. Par exemple

@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); 
} 

Si vous êtes inquiet au sujet de ce que vous pourriez être invalidante, il suffit de regarder au source for the MoxyJsonFeature. Vous ne manquez rien à moins que vous n'utilisiez le entity filtering feature