spring cloud使用JpaRepository,dao层无法注入容器,调试报空指针的解决思路

2023-10-26

     公司岗位调整,我从一个安卓开发转后台开发,以前在其他公司也接触过后台,那时公司用的是ssm框架,不过安卓还是
主业务,后台业务也只是略而兼之,并未深研,想着公司这次给机会做后台,本着技多不压身,就欣然接受,此时已经2019年了,微服务方兴未艾,如火如荼,自然我也就去学习微服务了,在学习过程中,spring cloud使用JpaRepository,编译是能通过,在调试接口时报了一个空指针,经过debug调试,是接口

public interface ProductInfoRepository extends JpaRepository<ProductInfo, String> {
   List<ProductInfo> findByProductStatus(List<String> productIdStatus);

}

 在下面的service中

@Service
public class ProductInfoServiceImpl implements IProductInfoService {
    @Autowired(required = false)
    private ProductInfoRepository productInfoRepository;

    @Override
    public List<ProductInfo> getProductList() {
      List<String> integerList = new ArrayList<>();
      integerList.add("1");
      List<ProductInfo> productInfoList = productInfoRepository.findByProductStatus(integerList);
      return productInfoList;
    }
}


      其中private ProductInfoRepository productInfoRepository是null的,ProductInfoRepository没有注入到容器中
调试几遍还是报空指针,只好求助百度,可以说困扰了我4天,都没有找到spring cloud使用JpaRepository报空指针的解决方案
网上找到的以下方案,都试了,都无用
1.private ProductInfoRepositoryproductInfoRepository是不是没有用@Autowired(required = false)注解,检查自己写的代码,是注解了
2.public interface ProductInfoRepository加上@Component,@Repository, 加上后,调试结果,service中的productInfoRepository还是为null,继续报空指针
3.controller和service中的方法是不是private的,检查自己的代码,方法都是public,排除该怀疑对象
4.entity实体类加上@table,@colum,调试结果,service中的productInfoRepository还是为null,报空指针
5.甚至自己怀疑是不是(required = false)了,去掉该配置,自然就报了另外一个异常,方案还是不对
6.Application上加上

@ComponentScan(basePackages = {"com.chengfeng.product.controller","com.chengfeng.product.service"}),
@EntityScan(basePackages = "com.chengfeng.product.entity")
@EnableJpaRepositories(basePackages = "com.chengfeng.product.repository")

即代码为


@SpringBootApplication()(exclude = DataSourceAutoConfiguration.class)
@EnableDiscoveryClient
@ComponentScan(basePackages = {"com.chengfeng.product.controller","com.chengfeng.product.service"}),
@EntityScan(basePackages = "com.chengfeng.product.entity")
@EnableJpaRepositories(basePackages = "com.chengfeng.product.repository")
public class ProductApplication {
    public static void main(String[] args) {
        SpringApplication.run(ProductApplication.class, args);
    }

}


上述加上,调试结果,service中的productInfoRepository还是为null,报空指针,
7.检查定义的entity实体类ProductInfo中的属性字段是否与数据库中一致,一一检查,都一一对应,排除该怀疑对象
8.当然什么重启了,清除缓存,说jar包冲突的,把原来的jar包全部清除重新下载,依然无用。
说实话,搞了几天都快崩溃了,放弃心又不甘,元气恢复,又鬼使神差继续调试。
9.是不是new service对象或者new  ProductInfoRepository对象了,检查自己的代码,也排除该怀疑对象
10.最后实在没有脾气了,把ProductInfoRepository定义的接口屏蔽掉,用JpaRepository原生生成的默认方法,还是报空指针。

最后,看了一眼ProductApplication 

@SpringBootApplication(exclude = DataSourceAutoConfiguration.class)
@EnableDiscoveryClient
public class ProductApplication {
    public static void main(String[] args) {
        SpringApplication.run(ProductApplication.class, args);
    }
}


死马当活马医,把(exclude = DataSourceAutoConfiguration.class)去掉,将原来出现的

Error creating bean with name 'entityManagerFactory' defined in class path resource
 [org/springframework/boot/autoconfigure/orm/jpa/HibernateJpaConfiguration.class]

异常暴露出来,把这个问题解决,看能不能顺便把空指针解决,然而运行后先报

HHH000342: Could not obtain connection to query metadata : Driver com.mysql.cj.jdbc.Driver claims to not accept jdbcUrl, 
jdbc:mysql:http://localhost:3306/product?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=UTC

了一个新的问题,再报

 Exception encountered during context initialization - cancelling refresh attempt: 
 org.springframework.beans.factory.BeanCreationException:
 Error creating bean with name 'entityManagerFactory' defined in class path resource
 [org/springframework/boot/autoconfigure/orm/jpa/HibernateJpaConfiguration.class]: 
 Invocation of init method failed; nested exception is org.hibernate.service.spi.ServiceException:
 Unable to create requested service [org.hibernate.engine.jdbc.env.spi.JdbcEnvironment]


 根据网上资料,application.properties中的spring.datasource.***肯定有问题,仔细看了几遍application.properties:

spring.application.name=product

server.port=8081
eureka.client.service-url.defaultZone: http://localhost:8761/eureka/

spring.datasource.driver-class-name = com.mysql.cj.jdbc.Driver
spring.datasource.url= jdbc:mysql:http://localhost:3306/product?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=UTC
spring.datasource.username = root
spring.datasource.password = 123456

spring.jpa.hibernate.ddl-auto = update

# 方便jpa调试的配置
spring.jpa.show-sql = true

也没发现什么问题,最后经过对比,发现jdbc:mysql后面多了个http,之前没有开发配置过数据库,也不知这里到底如何配置,什么时候这里多了个http,难道是因为多了个http,抱着疑问的态度改成

spring.datasource.url= jdbc:mysql://localhost:3306/product?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=UTC


 奇迹出现了,项目成功运行起来,最后接口调试,service中的productInfoRepository也成功注入容器了了,接口也调通了,也不报空指针了。此刻我已经知道,肯定是ProductInfoRepository中的接口写的不符合jpa规范,所以才造成ProductInfoRepository不能成功注入容器,将原来的方法:

// List<ProductInfo> findByProductStatus(List<String> productIdStatus);


 放开,运行,果然是又报错,

@SpringBootApplication加上(exclude = DataSourceAutoConfiguration.class),运行项目,错误消失,接口调试,继续报空指针,
至于为什么这个方法造成jpa不能注入容器,想必是这种接口定义方法不符合jpa规范,jpa识别不了。

最终,spring cloud使用jpa,要避免Repository不能注入容器,防止空指针的发生,除了排除上述10点怀疑对象,还要注意以下3点:

(1)@SpringBootApplication不能加(exclude = DataSourceAutoConfiguration.class)

(2)application.properties中关于数据库的配置一定要准确

(3)继承JpaRepository的dao层接口中自己定义的方法一定要符合jpa规范,按jpa的提示定义相关防范,不要自己随意命名,

最后附上spring cloud demo的部分

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>2.2.1.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>

    <groupId>com.chengfeng</groupId>
    <artifactId>product</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>product</name>
    <description>Demo project for Spring Boot</description>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <java.version>1.8</java.version>
        <spring-cloud.version>Hoxton.RC2</spring-cloud.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        </dependency>

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

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

        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
        </dependency>

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

        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-annotations</artifactId>
        </dependency>

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

        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
        </dependency>
    </dependencies>

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>${spring-cloud.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

    <repositories>
        <repository>
            <id>spring-milestones</id>
            <name>Spring Milestones</name>
            <url>https://repo.spring.io/milestone</url>
        </repository>
    </repositories>

</project>

application.properties代码:

spring.application.name=product

server.port=8081
eureka.client.service-url.defaultZone: http://localhost:8761/eureka/

spring.datasource.driver-class-name = com.mysql.cj.jdbc.Driver
spring.datasource.url= jdbc:mysql://localhost:3306/product?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=UTC
spring.datasource.username = root
spring.datasource.password = 123456

spring.jpa.hibernate.ddl-auto = update

# 方便jpa调试的配置
spring.jpa.show-sql = true
package com.chengfeng.product;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;

@SpringBootApplication
@EnableDiscoveryClient
public class ProductApplication {
    public static void main(String[] args) {
        SpringApplication.run(ProductApplication.class, args);
    }

}

 controller层ProductController.java代码

package com.chengfeng.product.controller;


@RestController
@RequestMapping("/product")
public class ProductController {

    @Autowired
    private IProductInfoService productInfoService;

    @GetMapping("/list")
    public void getProductList() {
        System.out.println("开始获取getProductList");
        //  1.查询所有商品
        List<ProductInfo> productInfoList = productInfoService.getProductList();
        System.out.println("获取的getProductList == ",productInfoList);

    }
}

Entity实体类ProductInfo.java代码

package com.chengfeng.product.entity;

import javax.persistence.Entity;
import javax.persistence.Id;
import java.math.BigDecimal;
import java.util.Date;

/**
 * 这里表名会自动转换,数据库中驼峰会是下划线,下面的变量也是
 */

@Entity
public class ProductInfo {

    @Id
    private String productId;

    /** 名字. */
    private String productName;

    /** 单价. */
    private BigDecimal productPrice;

    /** 库存. */
    private Integer productStock;

    /** 描述. */
    private String productDescription;

    /** 小图. */
    private String productIcon;

    /** 状态, 0正常1下架. */
    private Integer productStatus;

    /** 类目编号. */
    private Integer categoryType;

    private Date createTime;

    private Date updateTime;

    public String getProductId() {
        return productId;
    }

    public void setProductId(String productId) {
        this.productId = productId;
    }

    public String getProductName() {
        return productName;
    }

    public void setProductName(String productName) {
        this.productName = productName;
    }

    public BigDecimal getProductPrice() {
        return productPrice;
    }

    public void setProductPrice(BigDecimal productPrice) {
        this.productPrice = productPrice;
    }

    public Integer getProductStock() {
        return productStock;
    }

    public void setProductStock(Integer productStock) {
        this.productStock = productStock;
    }

    public String getProductDescription() {
        return productDescription;
    }

    public void setProductDescription(String productDescription) {
        this.productDescription = productDescription;
    }

    public String getProductIcon() {
        return productIcon;
    }

    public void setProductIcon(String productIcon) {
        this.productIcon = productIcon;
    }

    public Integer getProductStatus() {
        return productStatus;
    }

    public void setProductStatus(Integer productStatus) {
        this.productStatus = productStatus;
    }

    public Integer getCategoryType() {
        return categoryType;
    }

    public void setCategoryType(Integer categoryType) {
        this.categoryType = categoryType;
    }

    public Date getCreateTime() {
        return createTime;
    }

    public void setCreateTime(Date createTime) {
        this.createTime = createTime;
    }

    public Date getUpdateTime() {
        return updateTime;
    }

    public void setUpdateTime(Date updateTime) {
        this.updateTime = updateTime;
    }
}

dao层ProductInfoRepository.java代码

package com.chengfeng.product.repository;

import com.chengfeng.product.entity.ProductInfo;
import org.springframework.data.jpa.repository.JpaRepository;

import java.util.List;

public interface ProductInfoRepository extends JpaRepository<ProductInfo, String> {
  List<ProductInfo> findByProductStatus(Integer productStatus);
}

服务层ProductInfoServiceImpl.java代码

package com.chengfeng.product.service;

import com.chengfeng.product.common.ProductStatusEnum;
import com.chengfeng.product.entity.ProductInfo;
import com.chengfeng.product.repository.ProductInfoRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;


@Service
public class ProductInfoServiceImpl implements IProductInfoService {
    @Autowired(required = false)
    private ProductInfoRepository productInfoRepository;

    @Override
    public List<ProductInfo> getProductList() {
        List<ProductInfo> productInfoList = productInfoRepository.findByProductStatus(ProductStatusEnum.UP.getCode());
        return productInfoList;
    }
}

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

spring cloud使用JpaRepository,dao层无法注入容器,调试报空指针的解决思路 的相关文章

  • 安卓apk从浏览器下载后安装提示程序包解析异常处理!

    1 网上的处理一般都是如何适配安卓7 0 解决7 0的适配 而导致包解析异常 这个不多讲 主要说自己遇到的这点 如图 在mainfist配置清单中加上目标版本号和最小版本号即可优美解决
  • Java 判空新写法!干掉 if else !

    在文章的开头 先说下NPE问题 NPE问题就是 我们在开发中经常碰到的NullPointerException 假设我们有两个类 他们的UML类图如下图所示 在这种情况下 有如下代码 user getAddress getProvince
  • html中使行级标签隐藏显示出来,HTML标签显示类型

    HTML标签显示类型 HTML5学堂 码匠 依据HTML标签默认显示效果的不同 可以将HTML5标签简单的分为三大类 需要注意 在实际的分类中 并不仅仅是三类 一类是块状元素 一类是行元素 其他的元素显示类型较多 可以统一归为一类 在各类标

随机推荐

  • “面试造飞机,上岗拧螺丝“?2023软件测试岗面试真题超全面整理(最新版)

    软件测试这个岗位 想要找到一份高薪的工作 离不开繁杂的面试程序 这相信是很多准备应聘软件测试岗的朋友难题 很多已经在职多年的软件测试工程师对于这个岗位面试都谈虎色变 那么 为什么软件测试岗位的面试这么难呢 第一 软件测试属于互联网IT行业
  • 禁止本地中断

    禁止本地CPU中断是确保一组内核语句被当作一个临界区处理的主要机制 这个机制的意义是 即使当硬件设备产生了一个IRQ信号时 中断禁止也让内核控制路径继续执行 因此 这就提供了一种有效的方式 确保内核控制路径中的一些中断处理程序能访问的数据结
  • mes系统和plc通讯案例_MES系统与PLC数据集成主要方式

    现在工业化在迅速的发展 当然在发展过程中是离不开系统和软件的辅助 其中MES系统 ERP软件 PLC数据集成对企业有重要作用 那么MES系统与PLC数据集成主要方式有哪些 方式1 定期抓取数据 因为现在生产设备参数都是模拟量 数值一直在不停
  • CGI详解(原理,配置及访问)

    一 基本原理 CGI 通用网关接口 Common Gateway Interface 是一个Web服务器主机提供信息服务的标准接口 通过CGI接口 Web服务器就能够获取客户端提交的信息 转交给服务器端的CGI程序进行处理 最后返回结果给客
  • Java构造多边形的各点坐标合理性判断并抛出异常

    好久没有发过文章了 今天心情好 分享以下今天的java作业吧 题目要求是 构造多边形 并在点无法构造多边形时抛出对应的异常原因 直接上代码 1 构造点坐标 public class Point public int x y public P
  • React Native入门系列:创建我的第一个RN Project

    一 前言 1 准备 在创建RN之前 我们需要先安装相应的工具和搭建环境 可以参考我上一篇文章 React Native入门系列 如何搭建RN环境 Windows篇 2 目标 本章例子中文章达到目标 创建RN项目步骤 在创建中遇见的问题解决
  • Java学习之MyBatis

    1 与其他的ORM框架不同 MyBatis并没有将Java对象与数据库表关联起来 而是将Java方法与SQL语句关联 MyBatis提供了默认情况下基于Java HashMap的缓存实现 每个MyBatis应用程序主要都是使用SqlSess
  • ModuleNotFoundError: No module named ‘distutils.util‘ 解决在colab切换python3.7遇到的报错

    参考 colab修改python版本 mh 的博客 CSDN博客 colab python版本 已解决 ModuleNotFoundError No module named distutils util Harajukuuuu的博客 CS
  • 等保2.0 安全计算环境-服务器-Linux(三级系统)

    目录 1 身份鉴别 A 应对登录用户进行身份标识和鉴别 身份标识具有唯一性 身份鉴别信息具有复杂度要求并定期更换 1 询问管理员 了解系统是否已设置密码 核查登录过程中系统账户是否使用密码进行验证登录 2 查看是否存在空口令账户 3 检查密
  • Java开发常用指令

    Java开发常用指令 一 在IDEA terminal中常用命令 1 清理maven项目target内容 2 编译 打包一体化执行 3 编译 打包免test单元测试执行 二 纯JDK操作命令 1 编译java文件Hello java 2 运
  • 如何在vscode 背景配置一个动态小女孩

    D Microsoft VS Code resources app out vs code electron browser workbench
  • Do not access Object.prototype method ‘hasOwnProperty‘ from target object.问题的解决

    今天用vue写demo的时候想用hasOwnProperty这个api 去判断对象是否包含该值 出现了以上错误 这是我的写法 放在if里做条件判断 解决办法 改为这样的写法 即todo hasOwnProperty isEdit gt Ob
  • 计算机英语(编程词汇大全)

    计算机英语 编程词汇大全 来源地址 https blog csdn net D hj05 article details 80274471 application pl ke n 应用程式 应用 应用程序 application frame
  • OLED透明屏技术:引领品牌营销的视觉革命

    在当今竞争激烈的市场中 品牌营销的成功与否关系到企业的生存和发展 而随着科技的不断进步 新的广告展示技术不断涌现 其中OLED透明屏技术以其独特的视觉效果和创新性的应用在品牌营销领域引起了广泛关注 那么 尼伽将详细介绍OLED透明屏技术以及
  • ROS学习第三天 ROS的通讯机制

    感谢3 1 常用API Autolabor ROS机器人入门课程 ROS理论与实践 零基础教程 第三节 ROS的通讯机制 这一节主要讲的是通讯机制 就像前面说的那样 ROS通过节点发布信息 节点订阅信息实现通讯 基本的通讯机制主要有三种 话
  • vue-router中的#

    vue工程搭建完成后 我们运行在浏览器中打开 会发现url中多了一个 符号 有 是使用URL hash模式的缘故 代表网页中的一个位置 右边的字符就是该位置的标识符 从 开始的部分就是URL的锚部分 vue router默认的是hash模式
  • 具备“记忆”功能的VBA目录选择器

    大家使用任意一款浏览器 例如 Chrome Edge 下载文件时 如果 另存为 对话框选择C Download 那么下次再次使用 另存为 功能 对话框默认显示C Download 而不是根目录 在VBA开发中调用目录选择器并不复杂 但是这个
  • JDBCUtils工具类及其使用

    JDBCUtils工具类及其使用 1 作用 用于连接数据库 关闭资源 减少每次的关闭连接 避免代码冗余 2 JDBCUtils的创建 定义相关属性 4个 因为只需要一份所以用static关键字 定义相关属性 4个 因为只需要一份所以用sta
  • useMemo模拟useCallback

    useMemo缓存结果 useCallback缓存函数 1 看一下useMemo和useCallback底层源码的区别 useMemo 源码实现 组件首次渲染时 useMemo 的源码实现 React 版本 16 13 1 react re
  • spring cloud使用JpaRepository,dao层无法注入容器,调试报空指针的解决思路

    公司岗位调整 我从一个安卓开发转后台开发 以前在其他公司也接触过后台 那时公司用的是ssm框架 不过安卓还是 主业务 后台业务也只是略而兼之 并未深研 想着公司这次给机会做后台 本着技多不压身 就欣然接受 此时已经2019年了 微服务方兴未