找不到类型...自定义Spring数据存储库的属性

时间:2017-01-04 15:48:52

标签: spring spring-boot spring-data

我正在尝试实现自定义Spring存储库。我有界面:

public interface FilterRepositoryCustom {
    List<User> filterBy(String role);
}

实施:

public class FilterRepositoryImpl implements FilterRepositoryCustom {
...
}

和“main”存储库,扩展了我的自定义存储库:

public interface UserRepository extends JpaRepository<User, String>, FilterRepositoryCustom {
...
}

我正在使用Spring Boot,根据docs

  

默认情况下,Spring Boot将启用JPA存储库支持并查看   @SpringBootApplication所在的包(及其子包)   位于。

当我运行我的应用程序时,我收到此错误:

  

org.springframework.data.mapping.PropertyReferenceException:找不到类型User的属性filterBy!

8 个答案:

答案 0 :(得分:52)

此处的问题是您正在创建 FilterRepositoryImpl ,但您正在 UserRepository 中使用它。您需要创建 UserRepositoryImpl 才能使其发挥作用。

Read this doc for more detail

基本上

public interface UserRepositoryCustom {
    List<User> filterBy(String role);
}

public class UserRepositoryImpl implements UserRepositoryCustom {
...
}

public interface UserRepository extends JpaRepository<User, String>, UserRepositoryCustom {
...
}

答案 1 :(得分:1)

如果在您的spring配置中未选择FilterRepositoryCustom的impl类,则可能发生此错误:

@EnableJpaRepositories(basePackageClasses = {RepoPackageMarker.class, FilterRepositoryCustomImpl.class})

答案 2 :(得分:1)

对我来说,钥匙是

  1. @EnableJpaRepositories(repositoryBaseClass = MyRepositoryImpl.class)
  2. 接口上的
  3. @NoRepositoryBean批注

关注您的春季版本的文档 https://docs.spring.io/spring-data/data-commons/docs/2.3.4.RELEASE/reference/html/#repositories

因此我有:

@NoRepositoryBean
public interface SliceRepository<T, ID> extends JpaRepository<T, ID> {..}

public class SliceRepositoryImpl<T, ID> extends SimpleJpaRepository<T, ID> implements SliceRepository<T, ID> {..}


@EnableJpaRepositories(
        entityManagerFactoryRef = "entityManagerFactory",
        basePackages = {"com.some.servicename.repository"},
        repositoryBaseClass = SliceRepositoryImpl.class
)

答案 3 :(得分:0)

在我的一个项目中,我遇到了同样的问题。我通过在 pom.xml

中添加一行来解决该问题
<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-compiler-plugin</artifactId>
    <configuration>
        <includes>
            <include>com/my/package/entities/*.java</include>
            <include>com/my/package/repositories/*.java</include>
            <include>com/my/package/repositories/impl/*.java</include> <!-- add this -->
        </includes>
    </configuration>
</plugin>

答案 4 :(得分:0)

CustomRepository中的customMethod()是否只能定义两个参数?

1。实体类名称-customMethod(User user)

2.Entity类属性-customMethod(String firstName),此处的firstName是User Entity类的属性。

我不能拥有诸如customMethod(CustomCriteria条件)之类的条件,条件类包含用于构造动态查询的各种属性。

例如getStatusByCriteria(CustomCriteria criteria), CustomCriteria是用@Component注释的简单pojo,以便spring可以识别它。

尝试此操作时出现错误:

  

org.springframework.data.mapping.PropertyReferenceException:否   属性类型为UserRepository的条件!

答案 5 :(得分:0)

我有同样的问题。请检查您的包裹结构是否像这样

custom
   impl
      - FilterRepositoryCustomImpl.class
- FilterRepositoryCustom.class      

因为当我尝试使用自定义存储库时,看不到实现。 (该实现应该在相同的程序包中或在子程序包中,以便Spring可以看到它)

也许对某人有帮助(ノ^∇^)

答案 6 :(得分:0)

我也有这个错误。这是因为我已经配置了 elasticSearch 存储库机智包

@EnableElasticsearchRepositories("some.package")

接下来我将 MyElasticSearchRepository 从包 'some.package' 移动到另一个包,但没有更改配置

答案 7 :(得分:-2)

旧方法:

实体aThing = repository.findOne(1L); 新方法:

可选的aThing = repository.findById(1L);