代码之家  ›  专栏  ›  技术社区  ›  davidvera

Spring MVC REST API-没有“com.app.dao.adminsrepository”类型的限定bean

  •  0
  • davidvera  · 技术社区  · 6 年前

    这是我第一次使用 Spring MVC 具有 REST API 因为它有一个有角度的前端。我创建了3个配置文件:

    这是我的applicationconfig

    package com.app.config;
    
    import javax.persistence.EntityManagerFactory;
    import javax.sql.DataSource;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.ComponentScan;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.data.jpa.repository.config.EnableJpaRepositories;
    import org.springframework.jdbc.datasource.DriverManagerDataSource;
    import org.springframework.orm.jpa.JpaTransactionManager;
    import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean;
    import org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter;
    import org.springframework.transaction.PlatformTransactionManager;
    import org.springframework.web.servlet.config.annotation.EnableWebMvc;
    import org.springframework.web.servlet.view.InternalResourceViewResolver;
    import javax.persistence.EntityManagerFactory;
    
    @SuppressWarnings("unused")
    @EnableWebMvc
    @Configuration
    @ComponentScan("com.app.controller")
    @EnableJpaRepositories("com.app.dao")
    public class ApplicationConfig {
        @Bean
        public InternalResourceViewResolver setup() {
            InternalResourceViewResolver viewResolver = new InternalResourceViewResolver();
            viewResolver.setPrefix("/WEB-INF/views/");
            viewResolver.setSuffix(".jsp");
            return viewResolver;
        }
    
        @Bean
        public DataSource dataSource() {
            System.out.println("in datasoure");
            DriverManagerDataSource dataSource = new DriverManagerDataSource();
            dataSource.setDriverClassName("com.mysql.jdbc.Driver");
            dataSource.setUrl("jdbc:mysql://localhost:3306/db");
            dataSource.setUsername("root");
            dataSource.setPassword("");
            return dataSource;
        }
    
        @Bean
        public LocalContainerEntityManagerFactoryBean entityManagerFactory() {
            HibernateJpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter();
            vendorAdapter.setGenerateDdl(true);
            LocalContainerEntityManagerFactoryBean factory = new LocalContainerEntityManagerFactoryBean();
            factory.setJpaVendorAdapter(vendorAdapter);
            factory.setPackagesToScan("com.app.model");
            factory.setDataSource(dataSource());
            return factory;
        }
    
        @Bean
        public PlatformTransactionManager transactionManager(EntityManagerFactory emf) {
            JpaTransactionManager transactionManager = new JpaTransactionManager();
            transactionManager.setEntityManagerFactory(emf);
            return transactionManager;
        }
    }
    

    MVC配置

    package com.app.config;
    
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.web.servlet.config.annotation.EnableWebMvc;
    import org.springframework.web.servlet.config.annotation.ViewResolverRegistry;
    import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
    import org.springframework.web.servlet.view.InternalResourceViewResolver;
    
    @EnableWebMvc
    @Configuration
    public class MvcConfig implements WebMvcConfigurer {
        public void configureViewResolvers(ViewResolverRegistry registry) {
            registry.jsp("/WEB-INF/views/", ".jsp");
        }
    
        @Bean
        public InternalResourceViewResolver setup() {
            InternalResourceViewResolver viewResolver = new InternalResourceViewResolver();
            viewResolver.setPrefix("/WEB-INF/views/");
            viewResolver.setSuffix(".jsp");
            return viewResolver;
        }
    }
    

    网络化器

    package com.app.config;
    
    import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer;
    
    public class WebInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {
    
        @Override
        protected Class<?>[] getRootConfigClasses() {
            return null;
        }
        @Override
        protected Class<?>[] getServletConfigClasses() {
            return new Class[] { ApplicationConfig.class, MvcConfig.class };
        }
        @Override
        protected String[] getServletMappings() {
            return new String[] { "/" };
        }
    }
    

    我还创建了一个控制器:

    package com.app.controller;
    
    import java.util.List;
    
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Controller;
    import org.springframework.ui.Model;
    import org.springframework.web.bind.annotation.GetMapping;
    import org.springframework.web.bind.annotation.PathVariable;
    import org.springframework.web.bind.annotation.PostMapping;
    import org.springframework.web.bind.annotation.ResponseBody;
    
    import com.app.dao.AdminsRepository;
    import com.app.model.Admin;
    
    @SuppressWarnings("unused")
    @Controller
    public class AdminsController {
    
        @Autowired
        private AdminsRepository adminsRepository;
    
        @GetMapping("/admins")
        @ResponseBody
        public String getAllAdmins(Model model) {
            return adminsRepository.findAll().toString();
        }
    
        @GetMapping("/admin/{id}")
        @ResponseBody
        public String getAdmin(@PathVariable("id") int id, Model model) {
            return adminsRepository.findById((long) id).orElse(null).toString();
        }
        @PostMapping("/admin")
        @ResponseBody
        public String createAdmin(Admin admin, Model model) {
            System.out.println(admin);
            return adminsRepository.save(admin).toString(); 
        }
    }
    

    存储库:

    package com.app.dao;
    
    //import java.util.List;
    import org.springframework.data.jpa.repository.JpaRepository;
    import org.springframework.stereotype.Repository;
    
    import com.app.model.Admin;
    
    @Repository
    public interface AdminsRepository extends JpaRepository <Admin, Long>{ }
    

    我的模型:

    package com.app.model;
    
    import java.io.Serializable;
    import javax.persistence.*;
    
    import java.sql.Timestamp;
    import java.util.List;
    
    @Entity
    @Table(name="admins")
    @NamedQuery(name="Admin.findAll", query="SELECT a FROM Admin a")
    public class Admin implements Serializable {
        private static final long serialVersionUID = 1L;
    
        @Id
        private int id;
    
        @Column(name="created_at")
        private Timestamp createdAt;
    
        private String email;
        private String login;
        private String password;
        private String name;
        private String surname;
        // ... getters and setters + delegated methods 
    }
    

    当我开始运行应用程序并打开浏览器时,会收到一条错误消息:

    No qualifying bean of type 'com.app.dao.AdminsRepository' available:
    expected at least 1 bean which qualifies as autowire candidate. Dependency annotations:
    {@org.springframework.beans.factory.annotation.Autowired(required=true)}
    
    2 回复  |  直到 6 年前
        1
  •  1
  •   ALovedSon    6 年前

    戴维,

    只是把莫伊特已经给你的答案分解了。

    只能对正在扫描组件的包中声明的@autowire对象进行扫描。

    目前,@componentscan注释只包括控制器包:

    @ComponentScan("com.app.controller")
    

    像这样稍微扩大搜索范围:

    @ComponentScan("com.app")
    

    然后,它应该会拿起你的管理员的积极性和良好的嗡嗡声。

    干杯,

    肌萎缩性脊髓侧索硬化症

        2
  •  0
  •   moilejter    6 年前

    您需要将“com.app.dao”添加到Spring将扫描组件的包列表中(如果这些注释中有任何一个是Spring注释,也可能是“com.app.model”),或者将其更改为扫描“com.app”(它将包括应用程序中的所有内容)。