Spring MVC Rest API - Нет подходящего компонента типа com.app.dao.AdminsRepository - PullRequest
0 голосов
/ 14 ноября 2018

Это мой первый опыт использования 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 Config

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;
    }
}

WebInitializer

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 ]

0 голосов
/ 15 ноября 2018

Привет, Дэвид,

Просто разбив ответ, который мой вам уже дал.

Вы можете использовать только объекты @Autowire, которые объявлены в пакетах, проверяемых на наличие компонентов.

В настоящее время ваша аннотация @ComponentScan включает только ваш пакет контроллера:

@ComponentScan("com.app.controller")

Расширьте поиск немного следующим образом:

@ComponentScan("com.app")

Тогда он должен забрать ваш AdminsRepositoryи гул приятно.

Приветствия,

ALS

0 голосов
/ 15 ноября 2018

Вам необходимо добавить «com.app.dao» в список пакетов, которые Spring будет проверять на наличие компонентов (и, возможно, также «com.app.model», если какие-либо из этих аннотаций являются Spring), или просто изменить его.сканировать «com.app» (который будет включать все в вашем приложении.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...