如何设置Spring数据JPA存储库?

如何设置Spring数据JPA存储库?,spring,hibernate,spring-mvc,spring-data-jpa,spring-data,Spring,Hibernate,Spring Mvc,Spring Data Jpa,Spring Data,我使用的是没有Spring引导的SpringMVC 我试图在java类中设置SpringDataJPA存储库,而不是xml 我按照这里显示的那样做了。项目3 不想工作,我不知道怎么了 日志包含以下消息: org.springframework.beans.factory.UnsatisfiedDependencyExcep tion: Error creating bean with name 'userServiceImpl': Unsatisfied dependency expre

我使用的是没有Spring引导的SpringMVC

我试图在java类中设置SpringDataJPA存储库,而不是xml

我按照这里显示的那样做了。项目3

不想工作,我不知道怎么了

日志包含以下消息:

    org.springframework.beans.factory.UnsatisfiedDependencyExcep tion: Error creating bean with name 'userServiceImpl': Unsatisfied dependency expressed through field 'userRepository'; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionExcept ion: No qualifying bean of type 'com.testjpaspring.repository.UserRepository' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(req uired=true)}
将项目放在github上

UserRepository

    package com.testjpaspring.repository;

    import com.testjpaspring.model.User;
    import org.springframework.data.jpa.repository.JpaRepository;
    import org.springframework.stereotype.Repository;

    @Repository
    public interface UserRepository extends JpaRepository<User, Long> {
        User findByUsername (String username);
    }
UserServiceImpl

    package com.testjpaspring.service;

    import com.testjpaspring.model.User;
    import com.testjpaspring.repository.UserRepository;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Service;

    import javax.transaction.Transactional;

    @Service
    @Transactional
    public class UserServiceImpl implements UserService{

        @Autowired
        UserRepository userRepository;


        @Override
        public User findByUsername(String username) {
            return userRepository.findByUsername(username);
        }
    }
MyController

    package com.testjpaspring.controller;

    import com.testjpaspring.service.UserService;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Controller;
    import org.springframework.web.bind.annotation.GetMapping;
    import org.springframework.web.bind.annotation.ResponseBody;

    @Controller
    public class MyController {


        @Autowired
        UserService userService;


        @ResponseBody
        @GetMapping(value = "/")
        public String home () {
            return userService.findByUsername("roma").getUsername();

        }


    }
RootConfig

    package com.testjpaspring.config;

    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.ComponentScan;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor;
    import org.springframework.jdbc.datasource.DriverManagerDataSource;
    import org.springframework.orm.jpa.JpaTransactionManager;
    import org.springframework.orm.jpa.JpaVendorAdapter;
    import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean;
    import org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter;
    import org.springframework.transaction.PlatformTransactionManager;
    import org.springframework.transaction.annotation.EnableTransactionManagement;
    import org.springframework.web.servlet.config.annotation.EnableWebMvc;
    import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

    import javax.sql.DataSource;
    import java.util.Properties;

    @EnableWebMvc
    @Configuration
    @EnableTransactionManagement
    @ComponentScan({"com.testjpaspring.repository", "com.testjpaspring.service"})
    public class RootConfig implements WebMvcConfigurer {


        @Bean
        public LocalContainerEntityManagerFactoryBean entityManagerFactory() {
            LocalContainerEntityManagerFactoryBean em = new LocalContainerEntityManagerFactoryBean();
            em.setDataSource(dataSource());
            em.setPackagesToScan("com.testjpaspring.model");

            JpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter();
            em.setJpaVendorAdapter(vendorAdapter);
            em.setJpaProperties(additionalProperties());

            return em;
        }


        @Bean
        public DataSource dataSource(){
            DriverManagerDataSource dataSource = new DriverManagerDataSource();
            dataSource.setDriverClassName("com.mysql.cj.jdbc.Driver");
            dataSource.setUrl("jdbc:mysql://localhost:3306/testjpaspring?serverTimezone=UTC&useSSL=false");
            dataSource.setUsername( "root" );
            dataSource.setPassword( "1234" );
            return dataSource;
        }



        @Bean
        public PlatformTransactionManager transactionManager() {
            JpaTransactionManager transactionManager = new JpaTransactionManager();
            transactionManager.setEntityManagerFactory(entityManagerFactory().getObject());

            return transactionManager;
        }

        @Bean
        public PersistenceExceptionTranslationPostProcessor exceptionTranslation(){
            return new PersistenceExceptionTranslationPostProcessor();
        }

        Properties additionalProperties() {

            Properties properties = new Properties();
            properties.setProperty("hibernate.hbm2ddl.auto", "create-drop");
            properties.setProperty("hibernate.dialect", "org.hibernate.dialect.MySQL8Dialect");

            return properties;
        }

    }
    
    package com.testjpaspring.config;

    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.ComponentScan;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.web.servlet.ViewResolver;
    import org.springframework.web.servlet.config.annotation.EnableWebMvc;
    import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
    import org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer;
    import org.springframework.web.servlet.view.freemarker.FreeMarkerViewResolver;

    import java.util.Properties;

    @Configuration
    @EnableWebMvc
    @ComponentScan({"com.testjpaspring.controller"})
    public class Config implements WebMvcConfigurer{



        @Bean
        public FreeMarkerConfigurer freeMarkerConfigurer() {
            FreeMarkerConfigurer configurer = new FreeMarkerConfigurer();
            configurer.setTemplateLoaderPath("/WEB-INF/templates");
            configurer.setDefaultEncoding("UTF-8");

            Properties properties =  new Properties();
            properties.setProperty("default_encoding", "UTF-8");

            configurer.setFreemarkerSettings(properties);

            return configurer;
        }


        @Bean
        public ViewResolver getViewResolver(){
            FreeMarkerViewResolver viewResolver = new FreeMarkerViewResolver();
            viewResolver.setSuffix(".ftl");
            viewResolver.setContentType("text/html;charset=UTF-8");
            viewResolver.setCache(false);
            return viewResolver;
        }


    }
配置

    package com.testjpaspring.config;

    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.ComponentScan;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor;
    import org.springframework.jdbc.datasource.DriverManagerDataSource;
    import org.springframework.orm.jpa.JpaTransactionManager;
    import org.springframework.orm.jpa.JpaVendorAdapter;
    import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean;
    import org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter;
    import org.springframework.transaction.PlatformTransactionManager;
    import org.springframework.transaction.annotation.EnableTransactionManagement;
    import org.springframework.web.servlet.config.annotation.EnableWebMvc;
    import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

    import javax.sql.DataSource;
    import java.util.Properties;

    @EnableWebMvc
    @Configuration
    @EnableTransactionManagement
    @ComponentScan({"com.testjpaspring.repository", "com.testjpaspring.service"})
    public class RootConfig implements WebMvcConfigurer {


        @Bean
        public LocalContainerEntityManagerFactoryBean entityManagerFactory() {
            LocalContainerEntityManagerFactoryBean em = new LocalContainerEntityManagerFactoryBean();
            em.setDataSource(dataSource());
            em.setPackagesToScan("com.testjpaspring.model");

            JpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter();
            em.setJpaVendorAdapter(vendorAdapter);
            em.setJpaProperties(additionalProperties());

            return em;
        }


        @Bean
        public DataSource dataSource(){
            DriverManagerDataSource dataSource = new DriverManagerDataSource();
            dataSource.setDriverClassName("com.mysql.cj.jdbc.Driver");
            dataSource.setUrl("jdbc:mysql://localhost:3306/testjpaspring?serverTimezone=UTC&useSSL=false");
            dataSource.setUsername( "root" );
            dataSource.setPassword( "1234" );
            return dataSource;
        }



        @Bean
        public PlatformTransactionManager transactionManager() {
            JpaTransactionManager transactionManager = new JpaTransactionManager();
            transactionManager.setEntityManagerFactory(entityManagerFactory().getObject());

            return transactionManager;
        }

        @Bean
        public PersistenceExceptionTranslationPostProcessor exceptionTranslation(){
            return new PersistenceExceptionTranslationPostProcessor();
        }

        Properties additionalProperties() {

            Properties properties = new Properties();
            properties.setProperty("hibernate.hbm2ddl.auto", "create-drop");
            properties.setProperty("hibernate.dialect", "org.hibernate.dialect.MySQL8Dialect");

            return properties;
        }

    }
    
    package com.testjpaspring.config;

    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.ComponentScan;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.web.servlet.ViewResolver;
    import org.springframework.web.servlet.config.annotation.EnableWebMvc;
    import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
    import org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer;
    import org.springframework.web.servlet.view.freemarker.FreeMarkerViewResolver;

    import java.util.Properties;

    @Configuration
    @EnableWebMvc
    @ComponentScan({"com.testjpaspring.controller"})
    public class Config implements WebMvcConfigurer{



        @Bean
        public FreeMarkerConfigurer freeMarkerConfigurer() {
            FreeMarkerConfigurer configurer = new FreeMarkerConfigurer();
            configurer.setTemplateLoaderPath("/WEB-INF/templates");
            configurer.setDefaultEncoding("UTF-8");

            Properties properties =  new Properties();
            properties.setProperty("default_encoding", "UTF-8");

            configurer.setFreemarkerSettings(properties);

            return configurer;
        }


        @Bean
        public ViewResolver getViewResolver(){
            FreeMarkerViewResolver viewResolver = new FreeMarkerViewResolver();
            viewResolver.setSuffix(".ftl");
            viewResolver.setContentType("text/html;charset=UTF-8");
            viewResolver.setCache(false);
            return viewResolver;
        }


    }
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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
        <modelVersion>4.0.0</modelVersion>

        <groupId>com.testjpaspring</groupId>
        <artifactId>TestJpaSpring</artifactId>
        <version>1.0-SNAPSHOT</version>


        <build>
            <plugins>

                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-compiler-plugin</artifactId>
                    <version>3.8.1</version>
                    <configuration>
                        <source>${java.version}</source>
                        <target>${java.version}</target>
                        <encoding>${encoding}</encoding>
                    </configuration>
                </plugin>

            </plugins>
        </build>

        <properties>
            <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
            <failOnMissingWebXml>false</failOnMissingWebXml>
            <java.version>1.8</java.version>
            <encoding>UTF-8</encoding>
        </properties>

        <dependencyManagement>
            <dependencies>
                <dependency>
                    <groupId>org.springframework</groupId>
                    <artifactId>spring-framework-bom</artifactId>
                    <version>5.2.9.RELEASE</version>
                    <type>pom</type>
                    <scope>import</scope>
                </dependency>
            </dependencies>
        </dependencyManagement>


        <dependencies>


    <!--        Spring Framework-->
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-core</artifactId>
            </dependency>

            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-webmvc</artifactId>
            </dependency>

            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-context-support</artifactId>
            </dependency>

            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-orm</artifactId>
            </dependency>

            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-jdbc</artifactId>
            </dependency>

            <dependency>
                <groupId>org.springframework.data</groupId>
                <artifactId>spring-data-jpa</artifactId>
                <version>2.3.4.RELEASE</version>
            </dependency>



    <!--        Hibernate-->
            <dependency>
                <groupId>org.hibernate</groupId>
                <artifactId>hibernate-entitymanager</artifactId>
                <version>5.4.21.Final</version>
            </dependency>




    <!--        Остальные-->
            <dependency>
                <groupId>org.freemarker</groupId>
                <artifactId>freemarker</artifactId>
                <version>2.3.30</version>
            </dependency>

            <dependency>
                <groupId>javax.servlet</groupId>
                <artifactId>javax.servlet-api</artifactId>
                <version>4.0.1</version>
            </dependency>

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


        </dependencies>


    </project>

4.0.0
com.testjpaspring
TestJpaSpring
1.0-快照
org.apache.maven.plugins
maven编译器插件
3.8.1
${java.version}
${java.version}
${encoding}
UTF-8
假的
1.8
UTF-8
org.springframework
spring框架bom表
5.2.9.1发布
聚甲醛
进口
org.springframework
弹簧芯
org.springframework
SpringWebMVC
org.springframework
spring上下文支持
org.springframework
春季甲虫
org.springframework
SpringJDBC
org.springframework.data
spring数据jpa
2.3.4.1发布
org.hibernate
休眠实体管理器
5.4.21.最终版本
org.freemarker
自由标记
2.3.30
javax.servlet
javax.servlet-api
4.0.1
mysql
mysql连接器java
8.0.21
您失踪了

@EnableJpaRepositories(basePackages=“com.testjpaspring.repository”)
RootConfig
类上

事实上,这个类应该是这样的:

@配置
@ComponentScan(“com.testjpaspring.service”)
@启用事务管理
@EnableJpaRepositories(basePackages=“com.testjpaspring.repository”)
公共类RootConfig{
//保持方法不变
}
它与您的WebMVC设置无关

我刚刚意识到你发现了自己(之前没有点击另外5条评论),这里有一个解释:

这是现在Spring Boot通常做的事情。您需要显式地指定包名,因为注释处理器将查找带注释的配置类所在的包

如果没有注释或显式包名,SpringDataJPA存储库永远不会引导,因此在上下文中不可用。 如果您将
@Repository
添加到它们中,则会使它们成为Springbean(如果您将其添加到类中的话)。但是,
UserRepository
是一个声明性接口,而不是一个类


此外,您还可以从
UserRepository
中删除
@Repository
,JPA存储库不需要这样做。

这是一个警告,而不是错误。所以我假设其他一切都有效?这能回答你的问题吗?不,它不起作用。你给我的链接无助于解决问题。不仅显示警告,而且也不起作用。