Для параметра 0 конструктора в com.example.demo1.service.PersonService требуется компонент типа com.example.demo1.dao.PersonDao. - PullRequest
0 голосов
/ 13 марта 2020

Я новичок в Spring Boot Framework без каких-либо предварительных знаний о Spring Framework. Я столкнулся с этой ошибкой при запуске приложения Spring:

Ошибка указывает на класс обслуживания PersonService. java

package com.example.demo1.service;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Service;

import com.example.demo1.dao.PersonDao;
import com.example.demo1.model.Person;

@Service
public class PersonService {

    private final PersonDao personDao;

    // The @Autowired means that we are injecting in actual constructor. It means we are autowiring in the PersonDao interface
    // We have multiple implementation of the PersonDao interface. So to distinguish between them we use the @Qualifier
    @Autowired
    public PersonService(@Qualifier("fake") PersonDao personDao) {
        this.personDao = personDao;
    }

    // Here we have the option of providing the id or not
    public int addPerson(Person person) {
        return personDao.insertPerson(person);
    }
}

Ошибка показывает, что bean-компонент типа PersonDao Требуется, что не может быть найдено. Но я не мог определить, как создать боб. Я использовал внедрение зависимости для класса PersonDao. PersonDao. java

package com.example.demo1.dao;

import java.util.UUID;

import com.example.demo1.model.Person;

public interface PersonDao {

    int insertPerson(UUID id, Person person);

    default int insertPerson(Person person) {
        UUID id = UUID.randomUUID();
        return insertPerson(id, person);
    }
}

FakePersonDataAccessService

package com.example.demo1.dao;

import java.util.ArrayList;
import java.util.List;
import java.util.UUID;

import org.springframework.stereotype.Repository;

import com.example.demo1.model.Person;

// The @Repository annotation means that this class is served as a Repository
@Repository("fakeDao")
public class FakePersonDataAccessService implements PersonDao {

    private static List<Person> DB = new ArrayList<>();

    @Override
    public int insertPerson(UUID id, Person person) {
        DB.add(new Person(id, person.getName()));
        return 1;
    }
}

Person. java

package com.example.demo1.model;

import java.util.UUID;

import com.fasterxml.jackson.annotation.JsonProperty;

public class Person {

    private final UUID id;
    private final String name;

    public Person(@JsonProperty("id") UUID id,
                  @JsonProperty("name") String name) {
        this.id = id;
        this.name = name;
    }

    public UUID getId() {
        return id;
    }

    public String getName() {
        return name;
    }
}

PersonController. java

package com.example.demo1.api;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import com.example.demo1.model.Person;
import com.example.demo1.service.PersonService;
// We can implement the http methods(get, put, post, delete) implementation in the controller. We can do that by using the @RestController annotation
@RequestMapping("/api/v1/person")
@RestController
public class PersonController {

    private final PersonService personService;

    // The @Autowired means that the spring boot injects actual service in the constructor
    @Autowired
    public PersonController(PersonService personService) {
        this.personService = personService;
    }

    // The @RequestBody annotation shows that we convert the json body that we receive from the postman to an actual Person
    @PostMapping
    public void addPerson(@RequestBody Person person) {
        personService.addPerson(person);
    }
}
...