java 为什么在存储库中得到警告“不必要的”@Repository“”

sczxawaw  于 2023-01-11  发布在  Java
关注(0)|答案(3)|浏览(241)

我正在处理Sping Boot 项目。我的项目中有存储库文件,但它会在存储库类Unnecessary @Repository中显示警告消息。我正在使用我的存储库扩展JpaRepository<>。我的Spring版本是4,JDK版本是17
以下是我的依赖项

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-devtools</artifactId>
    <scope>runtime</scope>
    <optional>true</optional>
</dependency>

<dependency>
    <groupId>com.mysql</groupId>
    <artifactId>mysql-connector-j</artifactId>
    <scope>runtime</scope>
</dependency>

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-test</artifactId>
    <scope>test</scope>
</dependency>

这是我的存储库

@Repository // Here I get a warning to remove this annotation becasue its unnecessary
public interface CollegeRepo extends JpaRepository<College, Integer>{
    
}
fv2wmkja

fv2wmkja1#

您正在扩展JpaRepository<T, ID>接口,这意味着spring Boot 必须为您自动配置这个仓库bean,即它将被配置为SimpleJpaRepository<T, ID>的代理bean。
简而言之,我们不仅仅使用@Repository@Component注解创建bean,我们还扩展了spring-data接口,然后将自动配置存储库bean。

csbfibhn

csbfibhn2#

何时使用@Repository

你想提供你自己的实现,如何访问数据层以及应该做什么。在这种情况下,用@Repository标记你的实现类将允许你用spring管理这个类,这样你就可以自动连接必要的字段来访问数据层,比如EntityManagerJdbcTemplate...等等。和@Repository在最基本的水平,只是注册springbeans有一些轻微的增强使用@Repository,这可能使它有必要使用,也是最佳做法,在目前的情况下。
按照doc1
当与PersistenceExceptionTranslationPostProcessor结合使用时,用@Repository这样注解的类有资格进行Spring DataAccessException转换。,
doc2
持久性异常转换后处理器
Bean后处理器,它自动将持久性异常转换应用于任何用Spring的@Repository注解标记的Bean,并将相应的PersistenceExceptionTranslationAdvisor添加到公开的代理
上述案例使用@Repository的示例。

@Repository
public class CustomCarRepositoryImpl implements CustomCarRepository {

    @PersistenceContext
    private EntityManager entityManager;

    @Override
    public List<CarEntity> findCarsWithSpeed(Integer speed) {

        return entityManager.createQuery("Query to execute")
                .setMaxResults(50).getResultList();
    }
 }

public interface CustomCarRepository { 
     List<CarEntity> findCarsWithSpeed(Integer speed);
}

然后,您可以在其他组件中自动连接CustomCarRepository,并按照您的实现访问数据层。

何时不使用@Repository

当你只声明你的接口,并从Repository的任何Spring子接口扩展到org.springframework.data.repository时。
示例

public interface CarRepository extends JpaRepository<CarEntity, Long> {
    List<CarEntity> findCarsWithSpeed(Integer speed);
}

在这种情况下,Spring Boot将能够从auto configuration自动为您创建存储库bean。
唯一需要的进一步操作是,如果您自己的从Repository扩展的接口不存在于@Configuration@SpringBootApplication所在的同一个包或子包中,则您需要

  • 或者@EnableJpaRepositories(basePackages = {"base-package-where-repositories-exist"})
  • @AutoConfigurationPackage(basePackages = {"base-package-where-repositories-exist"})

为了帮助spring Boot 识别软件包,它应该查找该存储库的自动配置。(稍后的@AutoConfigurationPackage将影响存储库和自动配置所需的其他内容,如实体扫描等。因此,在项目中应小心使用它,而不仅仅是存储库。)

flseospp

flseospp3#

解决方案取决于您要使用的数据库类型。“配置数据源失败:未指定“url”属性,并且无法配置嵌入式数据源。”出现错误是因为您尚未在www.example.com中设置数据库的URLapplication.properties。要解决此问题,建议您打开application.properties并根据您的系统添加以下内容:

spring.datasource.url=jdbc:mysql://localhost:3306/restapi
spring.datasource.username=root
spring.datasource.password=

相关问题