[英]spring data jpa repository inject fails using @Autowired in spring boot
spring boot entry class 春季启动入门课程
package com.test;
@SpringBootApplication(exclude={
DataSourceAutoConfiguration.class,
DataSourceTransactionManagerAutoConfiguration.class})
public class AssetManagementDigital2Application {
public static void main(String[] args) {
SpringApplication.run(AssetManagementDigital2Application.class, args);
}
}
Controller class 控制器类
package com.test.assetmanagementdigital.controller;
@RestController
public class ShopController {
@Autowired
private ShopServiceImpl shopServiceImpl;
@RequestMapping(value="/shops",method=RequestMethod.POST)
public void shopDetails(Shop shop){
shopServiceImpl.addShopDetails(shop);
}
}
Entity 实体
package com.test.assetmanagementdigital.model;
import javax.persistence.Entity;
import javax.persistence.Table;
@Entity
@Table(name="ShopDetails")
public class Shop {
private String shopName;
private Address address;
public String getShopName() {
return shopName;
}
public void setShopName(String shopName) {
this.shopName = shopName;
}
public Address getAddress() {
return address;
}
public void setAddress(Address address) {
this.address = address;
}
}
data jpa repository interface 数据jpa存储库接口
package com.test.assetmanagementdigital.repository;
@Repository
public interface ShopRepository extends CrudRepository<Shop,Long>{
}
Service class 服务类
package com.test.assetmanagementdigital.service;
@Service
public class ShopServiceImpl {
@Autowired
private ShopRepository shopRepository;
public void addShopDetails(Shop shop) {
shopRepository.save(shop);
}
}
gradle file gradle文件
buildscript {
ext {
springBootVersion = '2.0.0.BUILD-SNAPSHOT'
}
repositories {
mavenCentral()
maven { url "https://repo.spring.io/snapshot" }
maven { url "https://repo.spring.io/milestone" }
}
dependencies {
classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}")
}
}
apply plugin: 'java'
apply plugin: 'eclipse-wtp'
apply plugin: 'org.springframework.boot'
apply plugin: 'io.spring.dependency-management'
apply plugin: 'war'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = 1.8
repositories {
mavenCentral()
maven { url "https://repo.spring.io/snapshot" }
maven { url "https://repo.spring.io/milestone" }
}
configurations {
providedRuntime
}
dependencies {
compile('org.springframework.boot:spring-boot-starter-data-jpa')
compile('org.springframework.boot:spring-boot-starter-web')
compile("com.h2database:h2")
compile group: 'org.hibernate', name: 'hibernate-core', version: '4.2.2.Final'
providedRuntime('org.springframework.boot:spring-boot-starter-tomcat')
testCompile('org.springframework.boot:spring-boot-starter-test')
}
I am getting following error 我收到了以下错误
Description:
Field shopRepository in com.test.assetmanagementdigital.service.ShopServiceImpl required a bean of type 'com.test.assetmanagementdigital.repository.ShopRepository' that could not be found.
Action:
Consider defining a bean of type 'com.test.assetmanagementdigital.repository.ShopRepository' in your configuration.
if i remove the @Autowired
annotation from ShopRepository
then it will throw `NullPointerException 如果我从
ShopRepository
删除@Autowired
注释,那么它将抛出`NullPointerException
I have tried @EnableJpaRepositories("com.test.assetmanagementdigital.repository")
here I get 我在这里尝试了
@EnableJpaRepositories("com.test.assetmanagementdigital.repository")
org.springframework.beans.factory.UnsatisfiedDependencyException:
Error creating bean with name 'shopController': Unsatisfied dependency expressed through field 'shopServiceImpl'; nested exception is
org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'shopServiceImpl': Unsatisfied dependency expressed through field 'shopRepository'; nested exception is
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'shopRepository': Post-processing of merged bean definition failed; nested exception is
java.lang.NoSuchMethodError: javax.persistence.PersistenceContext.synchronization()Ljavax/persistence/SynchronizationType;
Your Spring configuration is not correct. 您的Spring配置不正确。
The spring-boot-starter-data-jpa
already provides the hibernate-core
dependency. spring-boot-starter-data-jpa
已经提供了hibernate-core
依赖。 While you declare it with a specific version : 当您使用特定版本声明它时:
compile group: 'org.hibernate', name: 'hibernate-core', version: '4.2.2.Final'
You have not to declare it a second time as your specified version may be different and not compatible with the version provided by the starter. 您不必再次声明它,因为您的指定版本可能不同并且与启动器提供的版本不兼容。
And according to your error, it seems be the case as the javax.persistence.PersistenceContext.synchronization()
method is not found at runtime. 并且根据您的错误,似乎是因为在运行时找不到
javax.persistence.PersistenceContext.synchronization()
方法。
Post-processing of merged bean definition failed;
合并bean定义的后处理失败; nested exception is
java.lang.NoSuchMethodError
:javax.persistence.PersistenceContext.synchronization()Ljavax/persistence/SynchronizationType
;嵌套异常是
java.lang.NoSuchMethodError
:javax.persistence.PersistenceContext.synchronization()Ljavax/persistence/SynchronizationType
;
Just remove the hibernate-core
dependency and it should work. 只需删除
hibernate-core
依赖项就可以了。
You need to provide the package name to Spring to scan the repositories from, using @EnableJpaRepositories
annnotation, eg: 您需要使用
@EnableJpaRepositories
注释向Spring提供软件包名称以扫描存储库,例如:
@SpringBootApplication
@EnableJpaRepositories("com.test.assetmanagementdigital.repository")
public class AssetManagementDigital2Application
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.