Spring Data JPA中JpaRepository持续抛出Bean异常求助
Spring Data JPA Repository Bean 创建失败问题解决
问题描述
最近学习Spring Data JPA,按教程操作时创建Repository一直触发Bean异常,尝试注解配置和XML文件配置都无法解决,相关代码及异常信息如下:
原代码
启动类
package com.convential.mainclasspackage; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.boot.CommandLineRunner; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.context.annotation.Bean; @SpringBootApplication public class SpringDataJpaConventialApplication { public static void main(String[] args) { SpringApplication.run(SpringDataJpaConventialApplication.class, args); } @Bean CommandLineRunner commandlineRunner(ProductRepository productRepository) { return (args) -> { product tv = new product("TV", 250); productRepository.save(tv); }; } }
实体类
package com.convential.mainclasspackage; import jakarta.annotation.Nullable; import jakarta.persistence.Column; import jakarta.persistence.Entity; import jakarta.persistence.GeneratedValue; import jakarta.persistence.GenerationType; import jakarta.persistence.Id; import jakarta.persistence.Table; import jakarta.persistence.UniqueConstraint; @Entity(name = "product") @Table( name = "product", uniqueConstraints = { @UniqueConstraint(name = "product_name_unique_constraint", columnNames = "product_name") } ) public class product { @Id @GeneratedValue(strategy = GenerationType.AUTO) private int productId; @Column(name = "product_name", nullable = true, unique = true, columnDefinition = "TEXT") private String productName; @Column(name = "product_quantity", nullable = true, updatable = true) private int productQuantity; public product() {} public product(String productName, int productQuantity) { this.productName = productName; this.productQuantity = productQuantity; } public product(int productId, String productName, int productQuantity) { this.productId = productId; this.productName = productName; this.productQuantity = productQuantity; } public int getProductId() { return productId; } public String getProductName() { return productName; } public void setProductName(String productName) { this.productName = productName; } public int getProductQuantity() { return productQuantity; } public void setProductQuantity(int productQuantity) { this.productQuantity = productQuantity; } @Override public String toString() { return "Product [productId=" + productId + ", productName=" + productName + ", productQuantity=" + productQuantity + "]"; } }
Repository接口
package com.convential.mainclasspackage; import java.util.List; import org.springframework.data.jpa.repository.JpaRepository; public interface ProductRepository extends JpaRepository<product, Integer> { List<product> findByName(); product findByProduct_id(long id); }
异常信息
org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'commandlineRunner' defined in com.convential.mainclasspackage.SpringDataJpaConventialApplication: Unsatisfied dependency expressed through method 'commandlineRunner' parameter 0: Error creating bean with name 'productRepository' defined in com.convential.mainclasspackage.ProductRepository defined in @EnableJpaRepositories declared on JpaRepositoriesRegistrar.EnableJpaRepositoriesConfiguration: Could not create query for public abstract com.convential.mainclasspackage.product com.convential.mainclasspackage.ProductRepository.findByProduct_id(long); Reason: Failed to create query for method public abstract com.convential.mainclasspackage.product com.convential.mainclasspackage.ProductRepository.findByProduct_id(long); No property 'product' found for type 'product'; Did you mean 'productId'
问题分析
异常核心提示已经明确指出问题:
findByProduct_id方法命名不符合Spring Data JPA规则:实体类中对应的属性是productId,方法名里的product_id会被解析为寻找名为product的属性,导致找不到对应属性。findByName()方法同样不符合规则:实体类中没有name属性,只有productName,无法生成查询语句。findByProduct_id的参数类型是long,但实体类中productId是int类型,类型不匹配。
解决方案
- 修正Repository接口的方法命名和参数类型,使其匹配实体类属性:
package com.convential.mainclasspackage; import java.util.List; import org.springframework.data.jpa.repository.JpaRepository; public interface ProductRepository extends JpaRepository<product, Integer> { // 匹配实体类的productName属性 List<product> findByProductName(); // 修正命名为findByProductId,参数类型改为Integer(或int) product findByProductId(Integer id); }
- (可选但建议)修正实体类类名符合Java编码规范(类名首字母大写),同时修改启动类中的实例化代码:
修正后的实体类
package com.convential.mainclasspackage; import jakarta.annotation.Nullable; import jakarta.persistence.Column; import jakarta.persistence.Entity; import jakarta.persistence.GeneratedValue; import jakarta.persistence.GenerationType; import jakarta.persistence.Id; import jakarta.persistence.Table; import jakarta.persistence.UniqueConstraint; @Entity(name = "product") @Table( name = "product", uniqueConstraints = { @UniqueConstraint(name = "product_name_unique_constraint", columnNames = "product_name") } ) public class Product { // 类名首字母大写 @Id @GeneratedValue(strategy = GenerationType.AUTO) private int productId; @Column(name = "product_name", nullable = true, unique = true, columnDefinition = "TEXT") private String productName; @Column(name = "product_quantity", nullable = true, updatable = true) private int productQuantity; public Product() {} public Product(String productName, int productQuantity) { this.productName = productName; this.productQuantity = productQuantity; } public Product(int productId, String productName, int productQuantity) { this.productId = productId; this.productName = productName; this.productQuantity = productQuantity; } public int getProductId() { return productId; } public String getProductName() { return productName; } public void setProductName(String productName) { this.productName = productName; } public int getProductQuantity() { return productQuantity; } public void setProductQuantity(int productQuantity) { this.productQuantity = productQuantity; } @Override public String toString() { return "Product [productId=" + productId + ", productName=" + productName + ", productQuantity=" + productQuantity + "]"; } }
修正后的启动类
package com.convential.mainclasspackage; import org.springframework.boot.CommandLineRunner; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.context.annotation.Bean; @SpringBootApplication public class SpringDataJpaConventialApplication { public static void main(String[] args) { SpringApplication.run(SpringDataJpaConventialApplication.class, args); } @Bean CommandLineRunner commandlineRunner(ProductRepository productRepository) { return (args) -> { Product tv = new Product("TV", 250); // 对应修改类名 productRepository.save(tv); }; } }
修正后的Repository接口(对应实体类改名)
package com.convential.mainclasspackage; import java.util.List; import org.springframework.data.jpa.repository.JpaRepository; public interface ProductRepository extends JpaRepository<Product, Integer> { List<Product> findByProductName(); Product findByProductId(Integer id); }
内容的提问来源于stack exchange,提问作者Mat-Zaj
相关产品推荐
相关产品推荐

