代码之家  ›  专栏  ›  技术社区  ›  Ovidio Rossi

带有JPARepository的Spring应用程序中需要bean

  •  0
  • Ovidio Rossi  · 技术社区  · 2 年前

    我对bean实例化有一个问题。

    中构造函数的参数0 table.football.play.service.impl.PlayerServiceImpl 需要类型为的bean 'table.football.play.repository.PlayerRepository' 找不到。

    error

    这是我的课

    package table.football.play.repository;
    
    import org.springframework.data.jpa.repository.JpaRepository;
    import org.springframework.stereotype.Repository;
    import table.football.play.entity.Player;
    
    @Repository
    public interface PlayerRepository extends JpaRepository<Player,Long> {
      
    }
    
    

    这就是服务实现:

    package table.football.play.service.impl;
    
    import static table.football.play.util.ConvertEntityToDto.convertListPlayerEntityToListPlayerDto;
    
    import java.util.List;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Service;
    import table.football.play.dto.PlayerDTO;
    import table.football.play.entity.Player;
    import table.football.play.repository.PlayerRepository;
    import table.football.play.service.interf.PlayerService;
    
    @Service
    public class PlayerServiceImpl implements PlayerService{
      
      private PlayerRepository playerRepository;
      
      @Autowired
      public PlayerServiceImpl(PlayerRepository playerRepository){
        this.playerRepository = playerRepository;
      }
      
      @Override
      public List<PlayerDTO> findAll(){
        List<Player> listPlayer = playerRepository.findAll();
        List<PlayerDTO> playerDTOList = convertListPlayerEntityToListPlayerDto(listPlayer);
        return playerDTOList;
      }
    
    
    }
    

    有一个实体类

    package table.football.play.entity;
    
    import javax.persistence.Column;
    import javax.persistence.Entity;
    import javax.persistence.GeneratedValue;
    import javax.persistence.GenerationType;
    import javax.persistence.Id;
    import javax.persistence.Table;
    import lombok.Data;
    
    @Data
    @Entity
    @Table(name="players")
    public class Player {
      @Id
      @GeneratedValue(strategy = GenerationType.IDENTITY)
      private Long id;
      
      @Column(name="name")
      private String name;
      @Column(name="surname")
      private String surname;
      
    }
    

    最后这是我的pom.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
        <modelVersion>4.0.0</modelVersion>
        <parent>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-parent</artifactId>
            <version>3.1.5</version>
            <relativePath/> <!-- lookup parent from repository -->
        </parent>
        <groupId>table.football</groupId>
        <artifactId>play</artifactId>
        <version>0.0.1-SNAPSHOT</version>
        <name>game</name>
        <description>calcio balilla project</description>
        <properties>
            <java.version>17</java.version>
        </properties>
        <dependencies>
            <dependency>
                <groupId>javax.persistence</groupId>
                <artifactId>javax.persistence-api</artifactId>
                <version>2.2</version>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-web</artifactId>
            </dependency>
            <dependency>
                <groupId>org.springframework.data</groupId>
                <artifactId>spring-data-jpa</artifactId>
                <version>3.1.5</version>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-devtools</artifactId>
                <scope>runtime</scope>
                <optional>true</optional>
            </dependency>
            <dependency>
                <groupId>org.postgresql</groupId>
                <artifactId>postgresql</artifactId>
                <scope>runtime</scope>
            </dependency>
            <dependency>
                <groupId>org.projectlombok</groupId>
                <artifactId>lombok</artifactId>
                <optional>true</optional>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-test</artifactId>
                <scope>test</scope>
            </dependency>
        </dependencies>
    
        <build>
            <plugins>
                <plugin>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-maven-plugin</artifactId>
                    <version>${project.parent.version}</version>
                    <configuration>
                        <excludes>
                            <exclude>
                                <groupId>org.projectlombok</groupId>
                                <artifactId>lombok</artifactId>
                            </exclude>
                        </excludes>
                    </configuration>
                </plugin>
            </plugins>
        </build>
    
    </project>
    

    我也在字段上尝试@Autowired(这是一种更好的做法?或者在构造函数上发布@Autowireed很好?还是一样?)

    我读到一些人谈论创建默认构造函数。。。 但是Repository是一个接口,我该如何解决它?

    有人能给我解释一下这个错误背后的理论吗?对我来说,仅仅它有效是不够的,我想理解。

    非常感谢!

    1 回复  |  直到 2 年前
        1
  •  1
  •   Andrei Lisa    2 年前

    问题出在您在Service类中使用的依赖项注入中(它不起作用,请阅读 documentation )。

    而不是:

    private PlayerRepository playerRepository;
      
      @Autowired
      public PlayerServiceImpl(PlayerRepository playerRepository){
        this.playerRepository = playerRepository;
      }
    

    写入字段注入

    @Autowired
    private PlayerRepository playerRepository;
    

    或构造函数注入:

    private final PlayerRepository playerRepository;
      
      
      public PlayerServiceImpl(PlayerRepository playerRepository){
        this.playerRepository = playerRepository;
      }
    

    还有第二个问题

    <dependency>
                <groupId>javax.persistence</groupId>
                <artifactId>javax.persistence-api</artifactId>
                <version>2.2</version>
            </dependency>
    

    因为您使用的是弹簧靴>3.x使用Jakarta.persistence而不是javax,只需删除该依赖项并执行下一步操作。

    要修复它,请替换

    <dependency>
                <groupId>org.springframework.data</groupId>
                <artifactId>spring-data-jpa</artifactId>
                <version>3.1.5</version>
            </dependency>
    

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

    Entity 类全部替换 javax. 导入到 jakarta.

    它会解决问题的。