弹簧数据jpa存储库注入失败,在Spring启动时使用@Autowired [英] spring data jpa repository inject fails using @Autowired in spring boot
问题描述
春季启动入门课程
package com.test;
@SpringBootApplication(exclude={
DataSourceAutoConfiguration.class,
DataSourceTransactionManagerAutoConfiguration.class})
public class AssetManagementDigital2Application {
public static void main(String[] args) {
SpringApplication.run(AssetManagementDigital2Application.class, args);
}
}
控制器类
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);
}
}
实体
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
package com.test.assetmanagementdigital.repository;
@Repository
public interface ShopRepository extends CrudRepository<Shop,Long>{
}
服务类
package com.test.assetmanagementdigital.service;
@Service
public class ShopServiceImpl {
@Autowired
private ShopRepository shopRepository;
public void addShopDetails(Shop shop) {
shopRepository.save(shop);
}
}
gradle file
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')
}
我收到以下错误
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.
如果我从中移除 @Autowired
注释 ShopRepository
然后它会抛出`NullPointerException
if i remove the @Autowired
annotation from ShopRepository
then it will throw `NullPointerException
我试过 @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;
推荐答案
你的Spring配置不正确。
Your Spring configuration is not correct.
spring-boot-starter-data-jpa
已提供 hibernate-core
依赖。当您使用特定版本声明它时:
The spring-boot-starter-data-jpa
already provides the hibernate-core
dependency. While you declare it with a specific version :
compile group: 'org.hibernate', name: 'hibernate-core', version: '4.2.2.Final'
你还没有第二次申报因为您指定的版本可能不同,并且与启动器提供的版本不兼容。
根据你的错误,似乎是这种情况,因为找不到 javax.persistence.PersistenceContext.synchronization()
方法在运行时。
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.
合并bean定义的后处理失败;嵌套异常是
java.lang.NoSuchMethodError
:
javax.persistence.PersistenceContext.synchronization()Ljavax / persistence / SynchronizationType
;
只需删除 hibernate-core
依赖,它应该工作。
Just remove the hibernate-core
dependency and it should work.
这篇关于弹簧数据jpa存储库注入失败,在Spring启动时使用@Autowired的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!