【发布时间】:2021-10-02 12:19:04
【问题描述】:
我在无法更改的旧代码中遇到以下问题。我有一个多模块项目,它在 commons 模块中定义了一个 Spring Data 接口,如下所示:
package commons;
...
@NoRepositoryBean
public interface MyCustomRepository<P, I extends Number> extends JpaRepository<MyEntity, Integer>
{
MyEntity getOneAndCheck();
}
在另一个模块中我扩展了这个接口如下:
package data;
...
@Repository
public interface MyRepository extends MyCustomRepository<MyEntity, Integer>
{
...
}
所以,我不希望 Spring Data 为 MyEntity getOneAndCheck() 方法生成任何实现,因为它是这样实现的:
package data;
...
public class MyCustomRepositoryImpl implements MyCustomRepository
{
...
@Override
public MyEntity getOneAndCheck()
{
...
}
...
}
但是,当我启动应用程序时,出现以下异常:
...
Caused by: java.lang.IllegalArgumentException: Failed to create query for method public abstract MyEntity commons.MyCustomRepository.getOneAndCheck()! No property getOne found for type MyEntity!
...
因此,尽管有 @NoRepositoryBean 注释,但似乎 Spring Data 尝试为 MyEntity getOneAndCheck() 方法生成一个查询。这在我将从 Spring 3 与 Spring Data 迁移到 Spring Boot 2.5 的应用程序中按预期工作。
不确定所描述的行为是否与存在多个 Maven 模块以及存储库、实体和 DTO 位于不同模块中的事实有关。不确定当前使用 Spring 的运行方式与使用 Spring Boot 的运行方式之间是否应该有任何区别。但结果是这个遗留应用程序中的所有数十个存储库都失败了,并出现了上述异常。
可能很重要的一点是,主类需要使用注释来调整扫描:
@SpringBootApplication(scanBasePackages = "...")
@EnableJpaRepositories(basePackages={"...", "..."})
@EntityScan(basePackages= {"...", "..."})
public class MyApp
{
public static void main(String[] args)
{
SpringApplication.run(MyApp.class, args);
}
}
不确定从@NoRepositoryBean 的角度来看这些注释是否应该改变任何东西,但是一旦我添加了这个 Spring Boot 主类,问题就出现了。之前没有 Spring Boot 也能正常工作。
有什么建议吗?
非常感谢。
亲切的问候,
西摩
【问题讨论】:
标签: spring-boot spring-data-jpa spring-data