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

cidc1ykv  于 2023-02-28  发布在  Spring
关注(0)|答案(9)|浏览(143)

我正在尝试实现一个自定义的Spring存储库。我有一个接口:

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

实施:

public class FilterRepositoryImpl implements FilterRepositoryCustom {
...
}

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

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

我使用的是Sping Boot ,根据docs
默认情况下,Sping Boot 将启用JPA存储库支持,并在@SpringBootApplication所在的包(及其子包)中查找。
当我运行应用程序时,我得到这个错误:
数据Map。属性引用异常:找不到类型User的属性filterBy!

00jrzges

00jrzges1#

这里的问题是您正在创建**FilterRepositoryImpl,但您正在UserRepository中使用它。您需要创建UserRepositoryImpl**才能使其正常工作。
阅读此文档了解更多详细信息
基本上

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

public class UserRepositoryImpl implements UserRepositoryCustom {
...
}

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

Spring Data 2.x更新

这个答案是为Spring 1.x编写的。正如Matt Forsythe所指出的,命名期望随着Spring Data 2.0而改变。实现从the-final-repository-interface-name-with-an-additional-Impl-suffix变为the-custom-interface-name-with-an-additional-Impl-suffix
因此,在本例中,实现的名称为:UserRepositoryCustomImpl .

gstyhher

gstyhher2#

如果在Spring配置中没有拾取FilterRepositoryCustom的impl类,则可能发生此错误的另一种方式是:

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

g9icjywg3#

我遇到了同样的问题。请检查您的软件包结构是否如下所示

custom
   impl
      - FilterRepositoryCustomImpl.class
- FilterRepositoryCustom.class

因为当我尝试使用我的自定义存储库时,它看不到实现。(实现应该在同一个包或子包中,以便Spring看到它)
也许它能帮助某些人(^^)

crcmnpdw

crcmnpdw4#

CustomRepository中的customMethod()是否必须定义以下参数
1.实体类名称-customMethod(User user)
2.实体类属性-customMethod(String firstName),这里firstName是用户实体类的属性。
我不能使用customMethod(CustomCriteria标准)之类的东西吗?标准类包含用于构造动态查询的各种属性。
例如,getStatusByCriteria(CustomCriteria criteria), CustomCriteria是一个简单的pojo,用@Component注解,以便spring识别它。
当我尝试这样做时,我得到一个错误:
数据Map。属性引用异常:找不到类型UserRepository的属性条件!

bweufnob

bweufnob5#

对我来说钥匙就是
1.@启用Jpa存储库(存储库基类=我的存储库实现类)
1.接口上的@NoRepositoryBean注解
按照您的 Spring 版本的文档进行操作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
)
46scxncf

46scxncf6#

我也有这个错误。它发生是因为我配置了带有包的elasticSearch存储库

@EnableElasticsearchRepositories("some.package")

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

jvlzgdj9

jvlzgdj97#

我在我的一个项目中遇到了同样的问题,我通过在我的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>
rfbsl7qr

rfbsl7qr8#

对应于片段接口的类名中最重要的部分是Impl后缀。

6mw9ycah

6mw9ycah9#

老者道:

Entity aThing = repository.findOne(1L);

新方法:

Optional<Entity> aThing = repository.findById(1L);

相关问题