我正在尝试在Spring Boot应用程序中使用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);
}
}
但是在编译项目时我得到了:
申请失败
描述:字段crowdOperationRepository中 fr.investstore.ws.SampleController需要一个类型的bean “fr.investstore.repositories.CrowdOperationRepository”无法做到 被发现。
动作:考虑定义类型的bean 您的“fr.investstore.repositories.CrowdOperationRepository” 配置。
Woud not Spring是否通过接口自动为存储库生成bean? 我该如何解决这个问题?
编辑:我还尝试将Repository
注释(从org.springframework.stereotype.Repository
)放到CrowdOperationRepository
,但我得到了同样的错误
答案 0 :(得分:3)
在创建spring-boot应用程序时,我们需要在脑海中保留一些观点,如
始终将主类(带有`@SpringBootApplication批注的类)保留在顶级包中,其他类应位于子包下。
始终使用适当的注释标记您的bean类,例如所有存储库都应该用@Repository
注释标记,所有服务实现类都应该用@Service
标记,其他组件类应该用@Component
标记,定义我们bean的类应该标记为{ {1}}
启用您正在使用的功能,例如@Configuration
,@EnableJpaRepositories
,@EnableTransactionManagement
,这些注释还提供了一些功能,可让我们定义哪个包弹簧需要扫描。
因此,在您的情况下,您需要使用@EnableJpaAuditing
注释标记InvestStoreApplication
类,并使用@EnableJpaRepositories
标记CrowdOperationRepository
。
答案 1 :(得分:1)
你必须告诉你的spring boot应用程序加载JPA存储库。
将此副本复制到您的应用程序类
它将自动扫描您的JPA存储库并将其加载到您的spring容器中,即使您没有使用@Repository定义您的接口,它也会将该bean连接到您的依赖类中。
@EnableJpaRepositories(basePackages = { "fr.investstore.repositories" })
答案 2 :(得分:0)
感谢@JBNizet 的评论,这使它起作用。
我创建了这个答案,因为他没有:
<块引用>替换 SpringApplication.run(SampleController.class, args);使用 SpringApplication.run(InvestStoreApplication.class, args);。并删除控制器上无用的 @EnableAutoConfiguration。