春季数据自定义方法错误:org.springframework.data.mapping.propertyreferen



我正在尝试创建基本存储库类以添加新的自定义方法,但会遇到错误。

@NoRepositoryBean
public interface XRepository<T, ID extends Serializable> extends JpaRepository<T, ID> {
Optional<T> xxx(ID id);
}
public class XRepositoryImpl<T, ID extends Serializable> extends SimpleJpaRepository<T, ID> implements XRepository<T, ID> {
    private final EntityManager entityManager;
    public XRepositoryImpl(JpaEntityInformation entityInformation, EntityManager entityManager) {
        super(entityInformation, entityManager);
    }
    @Override
    public Optional<T> xxx(ID id) {
        return Optional.ofNullable(findOne(id));
    }
}
public interface BookRepository extends XRepository<Book, Long> {
}

堆栈跟踪:

Caused by: org.springframework.data.mapping.PropertyReferenceException: No property xxx found for type Book!
at org.springframework.data.mapping.PropertyPath.<init>(PropertyPath.java:77) ~[spring-data-commons-1.12.6.RELEASE.jar:na]
at org.springframework.data.mapping.PropertyPath.create(PropertyPath.java:329) ~[spring-data-commons-1.12.6.RELEASE.jar:na]
at org.springframework.data.mapping.PropertyPath.create(PropertyPath.java:309) ~[spring-data-commons-1.12.6.RELEASE.jar:na]

我已经检查了相同问题的答案,但它们没有帮助。他们指出了命名约定,我看不到任何问题。

弹簧数据mongo在类的命名约定上工作。如果您的存储库接口命名为XXXrepository,则您的自定义存储库接口应命名为XXXXRespositoryCustom(repositoyname Custom(,并且您的实现类应命名为XXXREPOSityImpl。只有这样,您的自定义实现才会被读取。

您很接近,但是您的班级命名是导致您的问题的原因。尝试以下操作:

public interface XRepositoryOperations<T, ID extends Serializable> {
    Optional<T> xxx(ID id);
}
public interface BookRepository extends JpaRepository<Book, Long>, XRepositoryOperations<Book, Long> {
}
public class XRepositoryImpl<T, ID extends Serializable> implements XRepositoryOperations<T, ID> {
    @Autowired private BookRepository bookRepository;
    @Override
    public Optional<T> xxx(ID id) {
        return Optional.ofNullable(bookRepository.findOne(id));
    }
}

使用您当前的类别定义,Spring正在通过Bookrepository到Xrepository作为将用于实现API的类。它正在尝试使用其方法 - 名称到Query Translation实现您的xxx方法。如果要从此方法自动实现中豁免方法,则需要在单独的接口中定义它们,然后将其存储库接口扩展。这是您将定义的Impl存储库类中实现的类。

编辑

另一个选项,如果您使用的是Java 8并希望将所有内容保留在基类中,则将提供xxx方法的默认实现:

public interface XRepository<T, ID extends Serializable> extends JpaRepository {
    default Optional<T> xxx(ID id) {
        return Optional.ofNullable(this.findOne(id));
    }
}

正如 @manish指出的那样,我缺少一种配置:

使弹簧数据基础架构了解自定义存储库 使用@enablejparepositories

的基础类
@Configuration
@EnableJpaRepositories(repositoryBaseClass = XRepositoryImpl.class)
class ApplicationConfiguration { … }

您正在使用弹簧数据JPA。您必须在存储库中使用@Repository。并在您的applicationContext.xml中使用以下代码:

<context:component-scan annotation-config="true"
    base-package="com.demo.test" />
<context:annotation-config />
<jpa:repositories base-package="com.demo.test.repository" />
<tx:annotation-driven transaction-manager="transactionManager" />

相关内容

最新更新