
John Soto
PreguntaHola a todos, he revisado paso a paso todas las clases hasta aquí y en el código descargado o en el que yo mismo hice, me sale este error al ejecutar:
*************************** APPLICATION FAILED TO START *************************** Description: Field mapper in com.platzi.market.persistence.ProductoRepository required a bean of type 'com.platzi.market.persistence.mapper.ProductMapper' that could not be found. The injection point has the following annotations: - @org.springframework.beans.factory.annotation.Autowired(required=true) Action: Consider defining a bean of type 'com.platzi.market.persistence.mapper.ProductMapper' in your configuration.``` No le he podido dar con el chiste. Gracias, Salu2.

Daniel Felipe
Pequeños detalles que te queman las pestañas! Saludos

John Soto
Hola, @feldan9119, te vas a reir del problema, resulta que no di un dato clave, resulta que yo estoy usando eclipse y gradel, esta combinación mas MapStruct tiene un detalle que le impide a la MapStruct crear las clases Impl partiendo de las interfaces con la anotación @Mapper, por lo que hay que entrar hacer una configuración adicional al eclipse (-Ver aquí-).
Hice la configuración y listo ya supere todo usando todo como lo explica la clase.
Agradezco mucho tu tiempo,
Salu2.

Daniel Felipe
Hola, he descargado tu proyecto y ha funcionado sin problemas. Me alegra hayas encontrado el problema.

John Soto
Hola, @feldan919 hice un cambio que me a dado un resultado positivo pero que me dejo con mas dudas, en la clase ProductoRepository tenia esto:
@Autowired private ProductMapper mapper;``` Le quite la anotación y funciono sin problema, bueno por lo menos compilo y ejecuto sin error. La lógica que use para hacer este cambio radica que en el mapper se hace esto:
@Mapper(componentModel = "spring")
Lo que le indica a Spring que el mapper es un componente que debe ser incluido, pero quede con dudas sobre el uso del @Autowired, por que entendí que este ultimo es usado para hacer la inyección de la dependencia como tal. Voy hacer mas pruebas a ver que sucede, te voy comentando que sucede. Gracias nuevamente, Salu2.

John Soto
Hola @feldan919 gracias por tu apoyo, mira aquí esta el repo https://github.com/ceduard0/platzi-market.
La clase donde uso el mapper es ProductRepository, donde supuestamente no la encuentra, pero si vez ahí esta la inyección de dependencia.
package com.olsoftware.platzimarket.persistence; import java.util.List; import java.util.Optional; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Repository; import com.olsoftware.platzimarket.domain.Product; import com.olsoftware.platzimarket.domain.repository.ProductRepository; import com.olsoftware.platzimarket.persistence.crud.ProductoCrudRepository; import com.olsoftware.platzimarket.persistence.entity.Producto; import com.olsoftware.platzimarket.persistence.mapper.ProductMapper; @Repository public class ProductoRepository implements ProductRepository { @Autowired private ProductoCrudRepository productoCrudRepository; @Autowired private ProductMapper mapper; @Override public List<Product> getAll() { List<Producto> productos = (List<Producto>) this.productoCrudRepository.findAll(); return mapper.toProducts(productos); } @Override public void delete(int idProducto) { productoCrudRepository.deleteById(idProducto); } @Override public Optional<List<Product>> getByCategory(int categoryId) { List<Producto> productos = (List<Producto>) this.productoCrudRepository .findByIdCategoriaOrderByNombreAsc(categoryId); return Optional.of(mapper.toProducts(productos)); } @Override public Optional<List<Product>> getScarseProducts(int quantity) { Optional<List<Producto>> productos = this.productoCrudRepository.findBycantidadStockLessThanAndEstado(quantity, true); return productos.map(prods -> mapper.toProducts(prods)); } @Override public Optional<Product> getProduct(int productId) { return this.productoCrudRepository.findById(productId).map(producto -> mapper.toProduct(producto)); } @Override public Product save(Product product) { return mapper.toProduct(this.productoCrudRepository.save(mapper.toProducto(product))); } }
Por otro lado encontré esto https://stackoverflow.com/questions/40384056/consider-defining-a-bean-of-type-package-in-your-configuration-spring-boot pero no en el curso no hablan de hacer esto.
Gracias nuevamente por tu apoyo,
Salu2.

Daniel Felipe
Hola John, al ver tu código me queda una duda, el error que subiste hace referencia a la clase ubicada en pck:
com.platzi.market.persistence.mapper.ProductMapper
com.olsoftware.platzimarket.persistence.mapper

John Soto
Hola @feldan9119, gracias por el comentario!, Esta es la definición de la clase ProducMapper
package com.olsoftware.platzimarket.persistence.mapper; import java.util.List; import org.mapstruct.InheritInverseConfiguration; import org.mapstruct.Mapper; import org.mapstruct.Mapping; import org.mapstruct.Mappings; import org.springframework.stereotype.Component; import com.olsoftware.platzimarket.domain.Product; import com.olsoftware.platzimarket.persistence.entity.Producto; @Component @Mapper(componentModel = "spring", uses = {CategoryMapper.class}) public interface ProductMapper { @Mappings({ @Mapping(source = "idProducto", target = "productId"), @Mapping(source = "nombre", target = "name"), @Mapping(source = "idCategoria", target = "CategoryId"), @Mapping(source = "precioVenta", target = "price"), @Mapping(source = "cantidadStock", target = "stock"), @Mapping(source = "estado", target = "active"), @Mapping(source = "categoria", target = "category") }) Product toProduct(Producto producto); List<Product> toProducts(List<Producto> productos); @InheritInverseConfiguration @Mappings({ @Mapping(target = "codigoBarras", ignore = true) }) Producto toProducto(Product product); }
Según lo que entendí es que @Mapper es de Struct y para que quede enlazado como componente de Spring se usa el atributo componetModel, por lo que no hace falta colocar el @Component, sin embargo hice el ajuste, pero me dio la misma excepción.
Incluso me baje las fuentes de la clase #34 y me sale la excepción.
Gracias,
Salu2.

Daniel Felipe
mira lo que dice el error, dice que esta buscando un bean de tipo
ProductMapper
ProductoRepository
ProductMapper