解决springboot无法注入JpaRepository的问题

 更新时间:2021年01月29日 08:46:32   作者:shumoyin  
这篇文章主要介绍了解决springboot无法注入JpaRepository的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧

使用内置服务器启动springboot项目时,会从@SpringBootApplication修饰类所在的包开始,加载当前包和所有子包下的类,将由@Component @Repository @Service @Controller修饰的类交由spring进行管理。

package com.facade;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.stereotype.Component;
@SpringBootApplication
public class Application {
  public static void main(String[] args) {
    ConfigurableApplicationContext context = SpringApplication.run(Application.class, args);
    String[] profiles = context.getEnvironment().getActiveProfiles();
    if (profiles != null) {
      for (String profile : profiles) {
        System.out.println("------------start with profile : " + profile);
      }
    }
  }
}

在使用Spring data jpa时,通常都是继承Repository接口相关的其他接口,然后Spring data jpa在项目启动时,会为所有继承了Repository的接口(@NoRepositoryBean修饰除外)创建实现类,并交由Spring管理。

例如,

package com.facade.repository;
import org.springframework.data.repository.PagingAndSortingRepository;
import com.facade.entity.HttpDoc;
public interface HttpDocRepository extends PagingAndSortingRepository<HttpDoc, Long> {
}
package com.facade.service;
import com.facade.entity.HttpDoc;
public interface HttpDocService {
  public HttpDoc save(HttpDoc entity);
  public HttpDoc getById(Long id);
  public Iterable<HttpDoc> findAll();
}
package com.
facade.service.impl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import com.facade.entity.HttpDoc;
import com.facade.repository.HttpDocRepository;
import com.facade.service.HttpDocService;
@Service
@Transactional
public class HttpDocServiceImpl implements HttpDocService {
  @Autowired
  private HttpDocRepository httpDocRepository;
  @Override
  public HttpDoc save(HttpDoc entity) {
    return httpDocRepository.save(entity);
  }
  @Override
  public HttpDoc getById(Long id) {
    return httpDocRepository.findOne(id);
  }
  @Override
  public Iterable<HttpDoc> findAll() {
    return httpDocRepository.findAll();
  }
}

以上代码Application处于HttpDocRepository HttpDocServiceImpl的根目录中,所以HttpDocRepository是可以被成功注入到HttpDocServiceImpl中的。

如果将Application移动到其他平行目录或者子目录,就算使用scanBasePackages指定扫描目录也无法将HttpDocRepository成功注入,会产生如下错误描述

Action:

Consider defining a bean of type 'com.facade.repository.HttpDocRepository' in your configuration.

补充:(亲测好用的解决方法)springboot2.x整合jpaRepository中的坑

今日折腾的时候发现了一起在1.5的时候整合jpa可以使用的findOne方法突然找不到了,如下:

可以看到这个方法里面不能传入String/Integer类型的值,所以百度了一番。

有网友给了一个通过get()再取值的方法,测试了一番并无效果。通过浏览调用方法列表发现了一个getOne()的方法,返回值类型和传递的参数都符合就试了一下

测试通过

这是由于jpa懒加载的问题引起的,可以在测试关联的实体类中添加@Proxy(lazy=false)解决

测试通过

顺带想着测试一下findById()的方法也发现了一个问题

返回值变为了一个Optional<>,这个可以通过get()方法得到想要的类型值。

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。如有错误或未考虑完全的地方,望不吝赐教。

相关文章

  • Java FileInputStream与FileOutputStream使用详解

    Java FileInputStream与FileOutputStream使用详解

    这篇文章主要介绍了Java FileInputStream与FileOutputStream使用详解,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-08-08
  • Spring Boot 实现Restful webservice服务端示例代码

    Spring Boot 实现Restful webservice服务端示例代码

    这篇文章主要介绍了Spring Boot 实现Restful webservice服务端示例代码,非常不错,具有参考借鉴价值,需要的朋友可以参考下
    2017-11-11
  • 基于Mybatis-Plus拦截器实现MySQL数据加解密的示例代码

    基于Mybatis-Plus拦截器实现MySQL数据加解密的示例代码

    用户的一些敏感数据,例如手机号、邮箱、身份证等信息,在数据库以明文存储时会存在数据泄露的风险,因此需要进行加密,解密等功能,接下来本文就给大家介绍基于Mybatis-Plus拦截器实现MySQL数据加解密,需要的朋友可以参考下
    2023-07-07
  • spring data jpa如何使用自定义repository实现类

    spring data jpa如何使用自定义repository实现类

    这篇文章主要介绍了spring data jpa如何使用自定义repository实现类,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-11-11
  • Kafka中使用Avro序列化和反序列化详解

    Kafka中使用Avro序列化和反序列化详解

    这篇文章主要介绍了Kafka中使用Avro序列化和反序列化详解,由于Kafka中的数据都是字节数组,在将消息发送到Kafka之前需要先将数据序列化为字节数组, 序列化器的作用就是用于序列化要发送的消息的,需要的朋友可以参考下
    2023-12-12
  • Java获取堆栈信息的三种方法小结

    Java获取堆栈信息的三种方法小结

    在Java编程中,获取堆栈信息对于调试和故障排除非常重要,Java提供了多种方式来获取当前线程的堆栈信息,下面就跟随小编一起学习一下常用的三种吧
    2024-03-03
  • java虚拟机

    java虚拟机

    2008-01-01
  • SpringBoot启动时加载指定方法的方式小结

    SpringBoot启动时加载指定方法的方式小结

    本文主要给大家介绍了Spring Boot项目启动时加载指定方法都有哪些方式的,文中给大家介绍了五种常用的方式,有详细的代码示例,具有一定的参考价值,需要的朋友可以参考下
    2023-08-08
  • 每日六道java新手入门面试题,通往自由的道路--多线程

    每日六道java新手入门面试题,通往自由的道路--多线程

    这篇文章主要为大家分享了最有价值的6道多线程面试题,涵盖内容全面,包括数据结构和算法相关的题目、经典面试编程题等,对hashCode方法的设计、垃圾收集的堆和代进行剖析,感兴趣的小伙伴们可以参考一下
    2021-06-06
  • spring-gateway网关聚合swagger实现多个服务接口切换的示例代码

    spring-gateway网关聚合swagger实现多个服务接口切换的示例代码

    这篇文章主要介绍了spring-gateway网关聚合swagger实现多个服务接口切换的示例代码,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-03-03

最新评论