简体   繁体   English

Spring数据jpa存储库注入失败,在Spring启动时使用@Autowired

[英]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.NoSuchMethodErrorjavax.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

Here's the documentation. 这是文档。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM