【问题标题】:How to fix compatibility issue with JSR-303 validation and orientdb如何修复 JSR-303 验证和 orientdb 的兼容性问题
【发布时间】:2014-11-09 19:54:32
【问题描述】:

我们正在尝试在我们的项目中使用 orientdb 1.7.8,但遇到了以下异常:

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

这是因为我们在项目中使用了 jsr-303 验证(目前实际上是非 jpa)。验证库扫描 JPA 持久管理器,Orientdb 在其 orient-object jar 中提供了该管理器。我们将来也想使用 orientdb 的对象框架,所以排除它不是一个选项。

OrientDB 的 JPA PersistentceProvider 实现似乎不完整:

public class OJPAPersistenceProvider implements PersistenceProvider {

    .... implemented all other methods ...

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

现在验证 jar 会自动选择这个类,因为 orientdb-object jar 在 META-INFO/services 中有 javax.persistence.spi.PersistenceProvider 文件。

那么,有解决方法吗?或者 orientdb 是否会支持 getProviderUtil 方法,以便它可以很好地与 jsr 303 验证配合使用?有没有办法让验证器忽略这个特定的 jpa 实现?

将 jsr 实现更改为使用休眠验证实现会给出 完全相同的例外。

【问题讨论】:

  • 使用不是真正的 JPA 实现的东西可能会出现问题?
  • 是的,orientdb jpa 实现不完整。我正在寻找解决方法。

标签: java hibernate validation jpa orientdb


【解决方案1】:

自己找到了解决方案。创建文件 META-INF/validation.xml(或更新它)。并添加如下内容:

<?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>

以及自定义解析器的实现:

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

通常情况是,启用 JPA 后,验证框架会通过 JPA 检查是否可以验证 bean 属性。这只是禁用这些检查并假定一切都是可验证的。

【讨论】:

    【解决方案2】:

    我找到了这个

    <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>
    

    【讨论】:

    • 那行不通。这将完全删除对象 api,但我仍然需要该 api。
    猜你喜欢
    • 1970-01-01
    • 2011-10-23
    • 2012-06-18
    • 2015-01-10
    • 1970-01-01
    • 2011-05-31
    • 1970-01-01
    • 2011-10-30
    • 2018-08-15
    相关资源
    最近更新 更多