0

我正在尝试在 Spring Boot 上为我的项目定义架构

我要做的是创建一个从 JpaRepository 扩展的通用存储库

public interface BaseRepository<T, ID extends Serializable> extends JpaRepository<T, ID> {
}

之后,每个 EntityDao 都会从 BaseRepository 扩展

@Repository    
public interface AuthorityDao extends BaseRepository<Authority, Long> {

        Authority findById(Long idRole);

        Authority findByRoleName(String findByRoleName);

    }

这就是我在存储库层上的做法。在服务层,我创建了一个名为 GenericService 的类,它实现了 IGenericService 并将我的 BaseRepository 注入其中:

@Service
public class GenericService<T, D extends Serializable> implements IGenericService<T, D> {

    @Autowired
    @Qualifier("UserDao")
    private BaseRepository<T, D> baseRepository;
// implemented method from IGenericService

}

每个服务都将从 GenericService 扩展:

public class AuthorityService extends GenericService<Authority, Long> implements IAuthorityService {

    @Autowired
    GenericService<Authority, Long> genericService;

当我运行该项目时,我收到此错误:


应用程序无法启动


说明:
fr.java.service.impl.GenericService 中的字段 baseRepository 需要找不到类型为“fr.config.daogeneric.BaseRepository”的 bean。

行动:
考虑在您的配置中定义“fr.config.daogeneric.BaseRepository”类型的 bean。

我怎么解决这个问题?

更新:

@SpringBootApplication
@EntityScan("fr.java.entities")
@ComponentScan("fr.java")
@EnableJpaRepositories("fr.java")
@EnableScheduling
@EnableAsync
@PropertySource({ "classpath:mail.properties", "classpath:ldap.properties" })
@EnableCaching
@RefreshScope
public class MainApplication extends SpringBootServletInitializer {

    private static final Logger log = LoggerFactory.getLogger(MainApplication.class);

    @Override
    protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
        return application.sources(MainApplication.class);
    }

    public static void main(String[] args) {
        log.debug("Starting {} application...", "Java-back-end-java");

        SpringApplication.run(MainApplication.class, args);
    }

}
4

1 回答 1

0

您有这个问题,因为您创建GenericService为一个 bean 并尝试注入BaseRepository,但 Spring 不能这样做,因为不清楚哪些类BaseRepository是参数化的。

从我这边我可以建议你下一步做:起初你GenericService不应该是一个豆子,他所有的孩子都是豆子,你应该GenericService在你的孩子们的课堂上删除注入,他们已经扩展了它。您GenericService应该是抽象的,它可以具有getRepository将在内部使用的抽象方法GenericService,并且存储库的注入将在GenericService子类中完成。

所以你应该有这样的东西:

public abstract class GenericService<T, D extends Serializable> implements IGenericService<T,D> {
    abstract BaseRepository<T, D> getRepository();
}

@Service
public class AuthorityService extends GenericService<Authority, Long> implements IAuthorityService {

    @Autowired
    BaseRepository<Authority, Long> baseRepository;

    public BaseRepository<Authority, Long> getRepository() {
        retrurn baseRepository;
    }
}
于 2018-08-17T16:12:18.380 回答