Skip to content

Services

Configurer un service

Pour configurer un service qu'on injectera ensuite dans un controleur, on devra simplement ajouter l'annotation @Service aux classes de services. Cette annotation permettra de s'assurer que le service puisse être injecté facilement dans une autre classe.

// La classe service
@Service
public class ProduitService {
    // implémentation du service
}

// Dans un controleur
@Controller
public class ProduitController {
    private final ProduitService produitService;

    public ProduitController(ProduitService produitService) {
        this.produitService = produitService;
    }
}

Le controleur aura alors accès au service configuré.

Injecter un JpaRepository

Pour utiliser les interfaces des repositories que nous créons, on pourra l'injecter dans le service puis ensuite s'en servir pour effectuer les différentes opérations sur la base de données.

public ChatService {
    private final ICharRepository chatRepository;

    public ChatService(IChatRepository chatRepository) {
        this.chatRepository = chatRepository;
    }

    public List<Chat> listeCompleteChats() {
        return chatRepository.findAll();
    }

    public Chat creerChat(Chat chat) {
        return chatRepository.save(chat);
    }

    public List<Chat> trouverChatsParNomSimilaire(String nom) {
        return chatRepository.chercherParNom(nom);
    }
}

Rôle du service

Dans une architecture MVC, on voudra déléguer toutes les opération sur les données au service. Le contrôleur sert à diriger vers les bonnes routes et le service à faire les opérations sur les données. Que ce soit de la récupération de données ou de la modification de données avant l'insertion dans la base de données par exemple.

Retourner des résultats paginés

Si notre source de données contient plusieurs enregistrements, il sera pratique de pouvoir fragmenter ces résultats pour qu'ils soient affichés avec de la pagination.

La méthode findAll() provenant de JpaReposiroty nous propose une surcharge qui prend en paramètre un objet de type Pageable.

import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Pageable;
...

public Page<Chat> getChatsPageable(int page, int taille) {
    Pageable pageable = PageRequest.of(page, taille);
    return chatRepository.findAll(pageable);
}

Dans le contrôleur, on pourra utiliser cette méthode et fournir les différents paramètres

@GetMapping("/chats2")
public String chats2(
        @RequestParam(value = "chatsPage", defaultValue ="10") int nbChatsPage,
        @RequestParam(value = "page", defaultValue ="0") int page,
        Model model) {
    Page<Chat> chatPage = chatService.getChatsPageable(page, nbChatsPage);

    model.addAttribute("chatPage", chatPage);
    model.addAttribute("pageCourante", page);
    // Récupérer le nombre de pages total pour l'affichage de la pagination
    model.addAttribute("totalPages", chatPage.getTotalPages());

    return "chats-paged";
}