Я новичок в 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);
}
}