2014-09-16 2 views
2

Nous essayons d'utiliser orientdb 1.7.8 dans notre projet, mais nous frappons l'exception suivante:Comment résoudre un problème de compatibilité avec la validation JSR-303 et orientdb

Caused by: java.lang.UnsupportedOperationException: getProviderUtil 
    at com.orientechnologies.orient.object.jpa.OJPAPersistenceProvider.getProviderUtil(OJPAPersistenceProvider.java:80) 
    at javax.persistence.Persistence$1.isLoaded(Persistence.java:78) 
    at org.apache.bval.jsr303.resolver.JPATraversableResolver.isReachable(JPATraversableResolver.java:34) 
    at org.apache.bval.jsr303.resolver.DefaultTraversableResolver.isReachable(DefaultTraversableResolver.java:60) 
    at org.apache.bval.jsr303.resolver.CachingTraversableResolver.isReachable(CachingTraversableResolver.java:82) 
    at org.apache.bval.jsr303.ConstraintValidation.isReachable(ConstraintValidation.java:241) 
    ... 158 more 

Cela se produit parce que nous utilisons JSR -303 validation dans notre projet (qui est actuellement en fait non-jpa). La bibliothèque de validation analyse le gestionnaire persistant JPA, que Orientdb fournit dans son jar orient-objet. Nous voulons également utiliser le framework objet pour orientdb dans le futur, donc l'exclure n'est pas une option.

L'implémentation JPA PersistentceProvider de OrientDB semble incomplète:

public class OJPAPersistenceProvider implements PersistenceProvider { 

    .... implemented all other methods ... 

    @Override 
    public ProviderUtil getProviderUtil() { 
     throw new UnsupportedOperationException("getProviderUtil"); 
    } 

maintenant le pot de validation reprend automatiquement cette classe, comme le pot-orientdb objet a le fichier javax.persistence.spi.PersistenceProvider-INFO META /prestations de service.

Alors, existe-t-il une solution de contournement pour cela? Ou orientdb supportera-t-il la méthode getProviderUtil pour qu'elle puisse être utilisée avec la validation de jsr 303? Est-il possible que le validateur ignore cette implémentation jpa particulière?

La modification de l'implémentation jsr pour utiliser l'implémentation de validation d'hibernation donne la même exception à .

+0

Un problème d'utiliser quelque chose qui n'est pas une véritable implémentation JPA peut-être? –

+0

Oui, l'implémentation d'orientdb jpa n'est pas complète. Je suis à la recherche d'une solution de contournement. – Wouter

Répondre

1

J'ai trouvé la solution moi-même. Créez le fichier META-INF/validation.xml (ou mettez-le à jour). Et ajouter quelque chose comme ce qui suit:

<?xml version="1.0" encoding="UTF-8"?> 
<validation-config 
    xmlns="http://jboss.org/xml/ns/javax/validation/configuration" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation= 
     "http://jboss.org/xml/ns/javax/validation/configuration"> 

    <traversable-resolver>MyValidationTraversableResolver</traversable-resolver> 

</validation-config> 

et la mise en œuvre du résolveur personnalisé:

public class MyValidationTraversableResolver extends DefaultTraversableResolver { 

    public MyValidationTraversableResolver() { 
     //we simply override the constructor to disable jpa detection 
    } 

    @Override 
    public boolean isReachable(Object traversableObject, Path.Node traversableProperty, Class<?> rootBeanType, Path pathToTraversableObject, ElementType elementType) { 
     return true; 
    } 

    @Override 
    public boolean isCascadable(Object traversableObject, Path.Node traversableProperty, Class<?> rootBeanType, Path pathToTraversableObject, ElementType elementType) { 
     return true; 
    } 
} 

Ce qui se passe normalement est que lorsque JPA est activé, les contrôles du cadre de validation via JPA qu'une propriété de haricot peut être validé Cela désactive simplement ces vérifications et suppose que tout est toujours valide.

0

J'ai trouvé ce

<dependency> 
<groupId>com.orientechnologies</groupId> 
<artifactId>orientdb-graphdb</artifactId> 
<version>${orientdb.version}</version> 
<exclusions> 
    <exclusion> 
     <groupId>com.orientechnologies</groupId> 
     <artifactId>orientdb-object</artifactId> 
    </exclusion> 
    </exclusions> 

</dependency> 
+0

Cela ne fonctionnera pas. Cela supprimerait complètement l'objet api, mais j'ai toujours besoin de cette API. – Wouter

Questions connexes