为什么在存储库中会收到“不必要的`@Repository`”警告?

4

我正在进行Spring 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>{
    
}

@Thomas,这是一个好的使用Spring的方式吗?因为之前我在Spring Boot上工作时,在存储库中没有出现过这个警告。 - Faheem azaz Bhanej
根据 org.springframework.data.repository.Repository 的 javadoc,Spring 将在类路径扫描期间发现扩展此接口的接口。 - sge
我猜测是Spring的注解处理器生成了那个警告,对吗?你能分享一下堆栈跟踪吗?此外,我无法确定何时或为什么添加了该警告,但我认为这可能有一个很好的原因,可能不足以引起错误。 - Thomas
那个堆栈跟你的问题似乎没有关系。当我要求一个时,我是在要求显示警告的跟踪。如果没有,因为它只在你的IDE中,那么你使用的是什么IDE,如何配置注释处理等? - Thomas
如果堆栈跟踪与您的问题无关,为什么要发布它? - Thomas
显示剩余2条评论
3个回答

7
你正在扩展 JpaRepository<T, ID> 接口,这意味着Spring Boot必须为你自动配置这个仓库bean,换句话说,它将配置一个代理bean作为 SimpleJpaRepository<T, ID>
简单来说,我们不仅使用@Repository 或者 @Component注解创建Bean,而是扩展了spring-data接口,然后我们的仓库bean会被自动配置。

没有使用@Repository注解,这是一个好的继续前进的方式吗? - Faheem azaz Bhanej

5

何时使用@Repository

当您想要提供自己的数据访问层实现并执行特定操作时,可以将实现类标记为@Repository。这样做可以使该类由Spring管理,以便您可以自动装配访问数据层所需的字段,如EntityManagerJdbcTemplate等。虽然在最基本的级别上,Component@Repository只是注册Spring bean,但使用@Repository可能会有一些轻微的增强,这在当前情况下是必要的,并且是最佳实践。

根据doc1

因此,用@Repository注释的类在与PersistenceExceptionTranslationPostProcessor结合使用时,可以进行Spring DataAccessException翻译。

doc2

PersistenceExceptionTranslationPostProcessor是一个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 的情况

当您只声明接口并从任何 Spring Repository 子接口扩展,来自 org.springframework.data.repository 时。

示例

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

在这种情况下,Spring Boot 将能够通过自动配置为您自动创建存储库bean。
唯一需要进一步操作的是,如果您自己的接口扩展自Repository,并且不存在于@Configuration@SpringBootApplication所在的同一包或子包中,则需要:
  • 要么 @EnableJpaRepositories(basePackages = {"存储库所在的基本包"})
  • 要么 @AutoConfigurationPackage(basePackages = {"存储库所在的基本包"})
以帮助 Spring Boot 识别它应该查找该存储库的自动配置的包。(后者的@AutoConfigurationPackage将影响自动配置所需的其他事物,例如实体扫描等,因此应谨慎在项目中使用而不仅仅是用于存储库。)

只是为了明确起见:@Repository 应该只放在自定义实现类上,对吧?所以回答 OP 的基本问题:对于实现,请使用注释,如果您只扩展接口,则不需要它。- 这样总结正确吗? - Thomas
@Thomas 如果你只是扩展org.springframework.data.repository.Repository的任何内容,则不需要它可以概括出注释不必要的情况。 - Panagiotis Bougioukos
有道理 - 也许可以加上作为 TLDR ;) - Thomas

0
解决方案取决于您打算使用哪种类型的数据库。您收到的“无法配置数据源:未指定'url'属性,也无法配置嵌入式数据源。”错误是因为您没有在application.properties中设置数据库的url。为了解决这个问题,我建议您打开application.properties文件,并根据您的系统添加以下内容:
spring.datasource.url=jdbc:mysql://localhost:3306/restapi
spring.datasource.username=root
spring.datasource.password=

很不幸,楼主似乎把你搞混了。你已经回答了被堆栈跟踪描述的问题,但是根据楼主的说法,这与实际问题——即@Repository注释有关。 - Thomas
@Thomas,非常抱歉我应该读一下他的问题陈述。谢谢你让我知道。 - Dheeraj Kashyap
没关系,这种情况偶尔也会发生在我身上 :) - Thomas
@DheerajKashyap 我很抱歉。 - Faheem azaz Bhanej
1
@FaeemazazBhanej 没关系,伙计! - Dheeraj Kashyap

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接