将现有代码从Spring Boot 2.2.0升级到2.2.1后,我遇到一个奇怪的问题。
看来我的spring数据jdbc存储库不再以某种方式被扫描:
Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'de.thd.dmpk.establishmentmanagement.IEstablishmentRepository' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {}
此外,此信息性调试行也位于启动2.2.1中:
Spring Data JDBC - Could not safely identify store assignment for repository candidate interface de.thd.dmpk.establishmentmanagement.IEstablishmentRepository. If you want this repository to be a JDBC repository, consider annotating your entities with one of these annotations: org.springframework.data.relational.core.mapping.Table.
当我将所有内容都切换回启动2.2.0时,信息消息以及上述异常消失了。
有任何提示吗?
编辑
实体
@Getter
@RequiredArgsConstructor(staticName = "of", access = AccessLevel.PUBLIC, onConstructor = @__({@PersistenceConstructor}))
@EqualsAndHashCode
public final class Establishment {
private final @Id
@With
long establishmentId;
@NotNull
@NotEmpty
@Size(max = 255)
private final
String establishmentName;
}
存储库
interface IEstablishmentRepository extends CrudRepository<Establishment, Long>
到目前为止,如果您不想更改数据库上的表名,则不需要@Table
注释。此外,@EnableJdbcRepositories
以此方式扫描每个文档:
如果未配置任何基本软件包,它将使用其中的 配置类驻留。 https://docs.spring.io/spring-data/jdbc/docs/current/reference/html/#jdbc.java-config
发生的事情很奇怪:)
答案 0 :(得分:1)
应该更加热情地阅读控制台输出:
Spring Data JDBC-无法安全地标识存储库候选接口de.thd.dmpk。Establishmentmentmanagement.I EstablishmentmentRepository的存储分配。如果您希望该存储库成为JDBC存储库,请考虑使用以下注释之一对实体进行注释:org.springframework.data.relational.core.mapping.Table。
用@Table
注释我的实体即可完成工作。放到我的实体上后,一切正常。
其原因是DATAJDBC-437。
当Spring Data JDBC与其他Spring Data Modules一起使用时,Spring Data JDBC曾经对所有存储库负责,导致每个接口有多个bean。
为了避免这种情况,在@Table
上需要在聚合根目录上添加注释,这些注释将被视为JDBC存储库的主题。
答案 1 :(得分:1)
有关此主题的一些补充信息:
如果您从spring-data-ldap
包中删除了spring-boot-starter-parent
依赖项,并用spring-ldap-core
替换了它,那么弹簧数据的多个模块就不再存在。
因此,如果您仅使用/依靠ldapTemplate
中的spring-ldap-core
,那么一切都很好。