Spring 编译时未找到数据存储库
Spring data repository not found at compile time
我正在尝试在 Spring 引导应用程序中使用 Spring 数据和存储库,但在编译项目时出现错误。
这是我的实体:
package fr.investstore.model;
import javax.persistence.Id;
...
@Entity
public class CrowdOperation {
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
public Long id;
@Enumerated(EnumType.STRING)
public RepaymentType repaymentType;
...
}
以及对应的Repository:
package fr.investstore.repositories;
import org.springframework.data.repository.CrudRepository;
import org.springframework.data.repository.PagingAndSortingRepository;
import org.springframework.stereotype.Repository;
import fr.investstore.model.CrowdOperation;
public interface CrowdOperationRepository extends CrudRepository<CrowdOperation, Long> {
}
我在WS控制器中使用它,通过Autowired
注解生成存储库:
package fr.investstore.ws;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RequestMapping;
...
@Controller
@EnableAutoConfiguration
public class SampleController {
@Autowired
private CrowdOperationRepository crowdOperationRepository;
@RequestMapping(path = "/", method = RequestMethod.GET)
@ResponseBody
public String getOperations(@RequestParam(required=true, defaultValue="Stranger") String name) {
crowdOperationRepository.save(new CrowdOperation());
return "Hello " + name;
}
}
以及应用程序的代码:
package fr.investstore;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import fr.investstore.ws.SampleController;
@SpringBootApplication
public class InvestStoreApplication {
public static void main(String[] args) {
SpringApplication.run(SampleController.class, args);
}
}
但是在编译项目时我得到:
APPLICATION FAILED TO START
Description: Field crowdOperationRepository in
fr.investstore.ws.SampleController required a bean of type
'fr.investstore.repositories.CrowdOperationRepository' that could not
be found.
Action: Consider defining a bean of type
'fr.investstore.repositories.CrowdOperationRepository' in your
configuration.
不会Spring通过接口自动为版本库生成一个bean?
我该如何解决?
编辑:我也尝试将 Repository
注释(来自 org.springframework.stereotype.Repository
)放到 CrowdOperationRepository
上,但我得到了同样的错误
您必须告诉您的 spring 引导应用程序加载 JPA 存储库。
将此复制到您的应用程序中class
它将自动扫描您的 JPA 存储库并将其加载到您的 spring 容器中,即使您没有使用 @Repository 定义接口,它也会将该 bean 连接到您的依赖 class。
@EnableJpaRepositories(basePackages = { "fr.investstore.repositories" })
在创建 spring-boot 应用程序时,我们需要记住一些要点,例如
始终将 main class(class with `@SpringBootApplication 注释)放在顶层包中,其他 classes 应该位于子包下。
始终使用适当的注释标记您的 bean classes,例如所有存储库都应该用 @Repository
注释标记,所有服务实现 classes 应该用 @Service
标记,其他组件 classes 应该用 @Component
标记, class 定义我们的 bean 应该标记为 @Configuration
启用您正在使用的功能,例如@EnableJpaRepositories
、@EnableTransactionManagement
、@EnableJpaAuditing
,这些注释还提供了让我们定义需要扫描哪个包 spring 的功能。
因此,在您的情况下,您需要使用 @EnableJpaRepositories
注释标记 InvestStoreApplication
class 并使用 @Repository
.
标记 CrowdOperationRepository
感谢@JBNizet 的评论,这使它起作用了。
我创建了这个答案,因为他没有:
Replace SpringApplication.run(SampleController.class, args); with SpringApplication.run(InvestStoreApplication.class, args);. And remove the useless @EnableAutoConfiguration on your controller.
注释您的实体 class 如下所示 spring 提示允许 spring 获得有效的存储库 bean
Spring Data JPA - 无法安全地识别存储库候选接口 com.xxxxx.xxxxRepository 的存储分配。
如果您希望此存储库成为 JPA 存储库,请考虑使用以下注释之一来注释您的实体:javax.persistence.Entity、javax.persistence.MappedSuperclass(首选),
或者考虑使用您的存储库扩展以下类型之一:org.springframework.data.jpa.repository.JpaRepository。
2022-05-06 12:32:12.623 [restartedMain] 信息 [.RepositoryConfigurationDelegate:201] - 在 3 毫秒内完成 Spring 数据存储库扫描。找到 0 个 JPA 存储库接口。
我正在尝试在 Spring 引导应用程序中使用 Spring 数据和存储库,但在编译项目时出现错误。
这是我的实体:
package fr.investstore.model;
import javax.persistence.Id;
...
@Entity
public class CrowdOperation {
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
public Long id;
@Enumerated(EnumType.STRING)
public RepaymentType repaymentType;
...
}
以及对应的Repository:
package fr.investstore.repositories;
import org.springframework.data.repository.CrudRepository;
import org.springframework.data.repository.PagingAndSortingRepository;
import org.springframework.stereotype.Repository;
import fr.investstore.model.CrowdOperation;
public interface CrowdOperationRepository extends CrudRepository<CrowdOperation, Long> {
}
我在WS控制器中使用它,通过Autowired
注解生成存储库:
package fr.investstore.ws;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RequestMapping;
...
@Controller
@EnableAutoConfiguration
public class SampleController {
@Autowired
private CrowdOperationRepository crowdOperationRepository;
@RequestMapping(path = "/", method = RequestMethod.GET)
@ResponseBody
public String getOperations(@RequestParam(required=true, defaultValue="Stranger") String name) {
crowdOperationRepository.save(new CrowdOperation());
return "Hello " + name;
}
}
以及应用程序的代码:
package fr.investstore;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import fr.investstore.ws.SampleController;
@SpringBootApplication
public class InvestStoreApplication {
public static void main(String[] args) {
SpringApplication.run(SampleController.class, args);
}
}
但是在编译项目时我得到:
APPLICATION FAILED TO START
Description: Field crowdOperationRepository in fr.investstore.ws.SampleController required a bean of type 'fr.investstore.repositories.CrowdOperationRepository' that could not be found.
Action: Consider defining a bean of type 'fr.investstore.repositories.CrowdOperationRepository' in your configuration.
不会Spring通过接口自动为版本库生成一个bean? 我该如何解决?
编辑:我也尝试将 Repository
注释(来自 org.springframework.stereotype.Repository
)放到 CrowdOperationRepository
上,但我得到了同样的错误
您必须告诉您的 spring 引导应用程序加载 JPA 存储库。
将此复制到您的应用程序中class
它将自动扫描您的 JPA 存储库并将其加载到您的 spring 容器中,即使您没有使用 @Repository 定义接口,它也会将该 bean 连接到您的依赖 class。
@EnableJpaRepositories(basePackages = { "fr.investstore.repositories" })
在创建 spring-boot 应用程序时,我们需要记住一些要点,例如
始终将 main class(class with `@SpringBootApplication 注释)放在顶层包中,其他 classes 应该位于子包下。
始终使用适当的注释标记您的 bean classes,例如所有存储库都应该用
@Repository
注释标记,所有服务实现 classes 应该用@Service
标记,其他组件 classes 应该用@Component
标记, class 定义我们的 bean 应该标记为@Configuration
启用您正在使用的功能,例如
@EnableJpaRepositories
、@EnableTransactionManagement
、@EnableJpaAuditing
,这些注释还提供了让我们定义需要扫描哪个包 spring 的功能。
因此,在您的情况下,您需要使用 @EnableJpaRepositories
注释标记 InvestStoreApplication
class 并使用 @Repository
.
CrowdOperationRepository
感谢@JBNizet 的评论,这使它起作用了。
我创建了这个答案,因为他没有:
Replace SpringApplication.run(SampleController.class, args); with SpringApplication.run(InvestStoreApplication.class, args);. And remove the useless @EnableAutoConfiguration on your controller.
注释您的实体 class 如下所示 spring 提示允许 spring 获得有效的存储库 bean
Spring Data JPA - 无法安全地识别存储库候选接口 com.xxxxx.xxxxRepository 的存储分配。 如果您希望此存储库成为 JPA 存储库,请考虑使用以下注释之一来注释您的实体:javax.persistence.Entity、javax.persistence.MappedSuperclass(首选), 或者考虑使用您的存储库扩展以下类型之一:org.springframework.data.jpa.repository.JpaRepository。 2022-05-06 12:32:12.623 [restartedMain] 信息 [.RepositoryConfigurationDelegate:201] - 在 3 毫秒内完成 Spring 数据存储库扫描。找到 0 个 JPA 存储库接口。