Комуникационен поток и CRUD операции

Следната диаграма демонстрира потока, свързан с обработката на заявка и отговор в REST API в Spring Boot приложение.

1. Потребителят извиква REST точка на достъп, която се управлява от REST контролера.

2. След това контролерът използва сервизния слой, за да обработи заявката.

3. Сервизният слой разчита на хранилището за комуникация с базата данни.

4. След като има отговор от хранилището, той се обработва от сервизния слой и се препраща към контролера.

5. Контролерът може да извърши допълнителна обработка и крайният отговор се предоставя на API клиента.

Да разгледаме пример, при който се създава семпло приложение със списък на курсове за обучение. Нека да създадем POJO клас Course, който описва курсовете с полета като id, name, category, rating и description.

public class Course {
    
    private Long id;
    private String name;
    private String category;
    private int rating;
    private String description;
    
    //Конструктор, getters & setters...
}

Да дефинираме интерфейс CourseRepository, с помощта на който ще управляваме курсовете в базата от данни. Интерфейсът разширява JpaRepository и дефинира потребителски метод findAllByCategory(), който извежда всички курсове от дадена категория.

@Repository
public interface CourseRepository extends JpaRepository<Course, Long> {

    //Обичайните методи за осъществяване на CRUD операциите се наследяват от интерфейса JpaRepository

    //потребителски метод
    List<Course> findAllByCategory(String category);
}

Нека сега да създадем сервизния слой на приложението. Дефинираме го с интерфейс, който съдържа операциите, поддържани в приложението.

public interface CourseService {

    Course createCourse(Course course);

    // + всички останали методи, касаещи CRUD операциите

    List<Course> getCoursesByCategory(String category);
}

Съставете конкретен клас CourseServiceImpl, който изпълнява тези операции.

// Анотиран с @Service, за да индикира, че е клас, 
// който реализира бизнес логика 
@Service
public class CourseServiceImpl implements CourseService {

    private CourseRepository courseRepository;

    public CourseServiceImpl(CourseRepository courseRepository) {
        this.courseRepository = courseRepository;
        }
    
    @Override
    public Course createCourse(Course course) {
    return courseRepository.save(course);
    }

    //+ всички останали методи, касаещи CRUD операциите

    @Override
    public List<Course> getCoursesByCategory(String category) {
    return courseRepository.findAllByCategory(category);
    }
}

Класът CourseServiceImpl е анотиран с анотация @Service, за да покаже, че е сервизен клас и съдържа бизнес логика. Той използва CourseRepository за извършване на необходимите операции с базата от данни.

Сега ни остава да дефинираме CourseController, който дефинира крайните точки на REST. Spring контролерът съдържа една или повече крайни точки и приема заявки от клиента. След това използва услугите, предлагани от сервизния слой, и генерира отговор. RestContoller-ът свързва резултата с тялото на отговора и го споделя със заявителя на крайната точка

@RestController
@RequestMapping("/courses/")
public class CourseController {

    private CourseService courseService;

    public CourseController (CourseService courseService) {
        this. courseService = courseService;
        }

    @PostMapping
    public ResponseEntity<Course> createCourse(@RequestBody Course course) {
        Course course = courseService.createCourse(course);
        return new ResponseEntity<>(course, HttpStatus.CREATED); 
    }

    //  + Точки на достъп за останалите операции
        
    @GetMapping("category/{name}")
    public ResponseEntity<List<Course>> getCourseByCategory(
    @PathVariable("name") String category) {
        List<Course> courseList = courseService.getCoursesByCategory(category);
        return new ResponseEntity<>(courseList, HttpStatus.OK); 
    }
}

Last updated