Partage
  • Partager sur Facebook
  • Partager sur Twitter

Erreur Cours Microservice Spring Java

Sujet résolu
18 octobre 2018 à 10:15:56

Bonjour, je suis face à un problème assez gênant, je suis actuellement entrain de suivre le cours sur les microservice avec spring vers la fin de la page et je suis bloqué car j'ai une erreur. Le cours étant déjà très difficile à suivre car le cours est bourré d'erreur (manque d'espace dans le code, nom de variable et de fonctions erronés ) ce qui fait que je dois adapter à chaque fois pour que ça marche.

Au niveau de la création du DAO tout plante:

class Product:

package com.ecommerce.microcommerce.model;


public class Product 
{
	private int id;
	private String nom;
	private int prix;
	
	public Product() {
	}
	
	public Product(int id, String nom, int prix) {
		this.id = id;
		this.nom = nom;
		this.prix = prix;
	}
	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	public String getNom() {
		return nom;
	}
	public void setNom(String nom) {
		this.nom = nom;
	}
	public int getPrix() {
		return prix;
	}
	public void setPrix(int prix) {
		this.prix = prix;
	}
	
	@Override
	public String toString()
	{
		return "Product{"
				+ "id= "+
				", nom= '"+ nom + '\''+
				", prix=" + prix + '}';
	}

}

class ProductDao:

package com.ecommerce.microcommerce.dao;
import com.ecommerce.microcommerce.model.Product;
import java.util.List;

public interface ProductDao 
{
	public List<Product>findAll();
	public Product findById(int id);
	public Product save(Product product);
}

class ProductDaoImpl:

package com.ecommerce.microcommerce.dao;
import com.ecommerce.microcommerce.model.Product;
import org.springframework.stereotype.Repository;
import java.util.ArrayList;
import java.util.List;

@Repository
public class ProductDaoImpl implements ProductDao 
{
	public static List<Product>products=new ArrayList<>();
	static 
	{
		products.add(new Product(1, new String("Ordinateur Portable"), 350));
		products.add(new Product(2, new String("Aspirateur Robot"), 250));
		products.add(new Product(3, new String("Table Ping Pong"), 500));
		
	}

	@Override
	public List<Product> findAll() {
		return products;
	}

	@Override
	public Product findById(int id) 
	{
		for (Product product : products)
		{
			if(product.getId() ==  id)
			{
				return product;
			}
		}
		return null;
		
	}

	@Override
	public Product save(Product product) 
	{
		products.add(product);
		return product;
		
	}

}

et la class ProductController où j'ai l'erreur:

package com.ecommerce.microcommerce.web.controller;
import com.ecommerce.microcommerce.dao.ProductDao;
import com.ecommerce.microcommerce.model.Product;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import java.util.List;


@RestController
public class ProductController 
{
	@Autowired
	private Product productDao;
	
	//recuperer liste produits
	@GetMapping(value="/Produits")
		public List<Product>listeProduits()
		{
			return productDao.findAll();
		}
	
	//recuperer produit par id
	@GetMapping(value="/Produits/{id}")
		public Product afficherProduit(@PathVariable int id)
		{
			return productDao.findById(id);
		}

}

mes méthodes finAll et findById ne trouvent pas quelque chose et je ne sais pas quoi...

Exception encountered during context initialization - cancelling refresh attempt: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'productController': Unsatisfied dependency expressed through field 'productDao'; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'com.ecommerce.microcommerce.model.Product' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)
***************************
APPLICATION FAILED TO START
***************************

Description:

Field productDao in com.ecommerce.microcommerce.web.controller.ProductController required a bean of type 'com.ecommerce.microcommerce.model.Product' that could not be found.


Action:

Consider defining a bean of type 'com.ecommerce.microcommerce.model.Product' in your configuration.




Si vous pouviez m'aider et si possible revoir le cours car je si vers les débuts et il faut tout adapter et qu'on à des erreurs je n'ose pas imaginer la suite :/

Merci à vous, bonne journée.

PS: Je me suis permis de reposté ici, car je pense avoir posté dans la mauvaise section avant... Don't juge my please

  • Partager sur Facebook
  • Partager sur Twitter
18 octobre 2018 à 12:17:02

Ton erreur est là...comme le message d'erreur te l'indique.

@Autowired

private Product productDao;

Relis attentivement cette ligne de code, tu vas trouver.

  • Partager sur Facebook
  • Partager sur Twitter
18 octobre 2018 à 14:37:03

Merci mais comme je suis le cours pour apprendre je ne sais pas...

Le code fournit dans le cours est le suivant

package com.ecommerce.microcommerce.web.controller;
import com.ecommerce.microcommerce.dao.ProductDao;
import com.ecommerce.microcommerce.model.Product;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import java.util.List;

@RestController
public class ProductController {

    @Autowired
    private Product DaoproductDao;

    //Récupérer la liste des produits
    @RequestMapping(value="/Produits", method=RequestMethod.GET)
    publicList<Product>listeProduits() {
        return productDao.findAll();
    }

    //Récupérer un produit par son Id
    @GetMapping(value="/Produits/{id}")
    public Product afficherUnProduit(@PathVariable int id) {
        return productDao.findById(id);
    }
}



Merci de ta réponse.
Et cela n'explique pas pourquoi findAll et findById ne trouvent pas les méthodes de ProductDao..

-
Edité par SartVille 18 octobre 2018 à 14:40:07

  • Partager sur Facebook
  • Partager sur Twitter
19 octobre 2018 à 8:53:41

Je veux bien que le code contienne des bugs, mais le but du cours est tout de même d'apprendre, de comprendre ce que tu manipules, donc c'est un peu génant que tu te bloques sans chercher à comprendre.

Tu utilises des technologies Open Source, comme Spring. Ces technologies évoluent tout le temps, et la documentation est souvent imprécise. L'expérimentation fait partie du quotidien des développeurs. Comprendre et corriger, au besoin. Partager ensuite.

Tu me donnes deux versions du source. La première issue de ton premier message :

@Autowired
private Product productDao;


La seconde, de ton second message :

@Autowired
private Product DaoproductDao;


Dans les deux cas il y a une erreur. Si la seconde version est celle du source, il y a une FAUTE DE FRAPPE qui fait que ça ne marche pas. La première version quant à elle, contient une ERREUR DE CONCEPTION.

Le message d'erreur t'indique le problème, pratiquement immédiatement : SPRING recherche un BEAN de type Product pour l'injecter dans la variable productDao.

Est-ce que Product est un bean, est-ce que c'est ton DAO ? Ou est-ce que c'est une classe qui représente une entité ?

C'est bien entendu la seconde réponse la bonne.

Donc il n'y a aucune raison qu'un bean de type PRODUCT soit présent dans la configuration de ton service.

En revanche, il est compréhensible qu'un bean de type ProductDao soit démarré, puisqu'il est indispensable à l'accès aux entités de type Product.

Donc le problème vient du fait que le TYPE de la variable productDao (1er source) ou DaoproductDao (2nd source) n'est pas Product...

En fait, je pense que le second source était proche, mais avec une erreur de frappe.

Au lieu de :

Product DaoproductDao;


Il faut

ProductDao productDao;


Donc l'espace est mal placé.

-
Edité par SébastienGRENIER3 19 octobre 2018 à 8:56:25

  • Partager sur Facebook
  • Partager sur Twitter
19 octobre 2018 à 9:55:31

Bonjour, merci beaucoup, effectivement après réflexion c'est bien logique... J'avais essayé plusieurs manipulation mais sans résultats..

J’étais focalisé sur le productDao au lieu du Product... ça marche maintenant merci ! Et j'avais essayé de trouver l'erreur sur internet mais souvent les solutions ne s'appliquaient pas à mon cas...

  • Partager sur Facebook
  • Partager sur Twitter
19 octobre 2018 à 10:01:13

Encore une fois j'insiste : la cause de ton problème était assez évidente.

Quand je dis "évidente", cela ne veut pas dire que tu dois la trouver en 2 secondes comme je l'ai fait...cela veut dire que c'est un problème de fond, une notion de base de l'informatique et que, avec le temps, ça doit devenir un réflexe...mais aussi que, en lisant correctement ton code ET le message d'erreur, tu dois rapidement comprendre d'ou vient le problème.

Ici, tu as une variable qui n'a pas le bon type.

Il est évident que tu ne peux pas appeler des méthodes sur un objet si celles-ci n'existent pas. Si l'objet n'est pas celui que tu crois avoir, alors ton code ne marche pas, raison pour laquelle les "find" ne compilent pas.

Entre les erreurs de compilation d'un côté et les erreurs de lancement de Spring de l'autre, tu avais sous les yeux tous les messages de diagnostic te permettant de résoudre le problème.

Savoir lire et comprendre ces messages, et cibler très vite d'ou vient l'erreur est une compétence fondamentale de tout développeur...d'ou ma remarque.

GOOGLE ne peut t'aider que lorsque tu maîtrises les fondamentaux et que tu cherches à comprendre, par exemple, comment fonctionne telle ou telle librairie.

Bon apprentissage !

  • Partager sur Facebook
  • Partager sur Twitter
19 octobre 2018 à 10:27:03

Oui, après comme je ne maîtrise pas encore très bien les notions de Bean, j'étais perdu alors que l'erreur venait simplement d'un nom de variable... C'est juste du java et pourtant... :D

Merci !

-
Edité par SartVille 19 octobre 2018 à 10:27:27

  • Partager sur Facebook
  • Partager sur Twitter
14 novembre 2019 à 14:23:56

Bonjour j'ai un probleme au niveau de mon API d'ajout lorsque je la teste cela me sort cette erreur:

    "timestamp""2019-11-14T13:18:18.956+0000",
    "status"400,
    "error""Bad Request",
    "message""Required request body is missing: public void com.ecommerce.microcommerce.web.controller.ProductController.ajouterProduit(com.ecommerce.microcommerce.model.Product)",
    "path""/Produits"

pouvez vous m'aider svp ?

voici mon api :

//ajouter un produit
@PostMapping(value = "/Produits/")
public void ajouterProduit(@RequestBody Product product) {
productDao.save(product);
}

-
Edité par BryanOhayon 14 novembre 2019 à 14:24:58

  • Partager sur Facebook
  • Partager sur Twitter

BryanOhayon

14 novembre 2019 à 18:09:01

@BryanOhayon  Bonjour, merci de ne pas squatter le sujet d'un autre membre et de ne pas déterrer d'ancien sujet résolu.  Créer votre propre sujet.

Je ferme.

Déterrage

Citation des règles générales du forum :

Avant de poster un message, vérifiez la date du sujet dans lequel vous comptiez intervenir.

Si le dernier message sur le sujet date de plus de deux mois, mieux vaut ne pas répondre.
En effet, le déterrage d'un sujet nuit au bon fonctionnement du forum, et l'informatique pouvant grandement changer en quelques mois il n'est donc que rarement pertinent de déterrer un vieux sujet.

Au lieu de déterrer un sujet il est préférable :

  • soit de contacter directement le membre voulu par messagerie privée en cliquant sur son pseudonyme pour accéder à sa page profil, puis sur le lien "Ecrire un message"
  • soit de créer un nouveau sujet décrivant votre propre contexte
  • ne pas répondre à un déterrage et le signaler à la modération

Je ferme ce sujet. En cas de désaccord, me contacter par MP.

  • Partager sur Facebook
  • Partager sur Twitter