Hola 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...

John Soto

John Soto

Pregunta
studenthace 4 años

Hola 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.
8 respuestas
para escribir tu comentario
    Daniel Felipe

    Daniel Felipe

    studenthace 4 años

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

    John Soto

    John Soto

    studenthace 4 años

    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

    Daniel Felipe

    studenthace 4 años

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

    John Soto

    John Soto

    studenthace 4 años

    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

    John Soto

    studenthace 4 años

    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

    Daniel Felipe

    studenthace 4 años

    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
    pero el mapper que subiste se encuentra en el pck:
    com.olsoftware.platzimarket.persistence.mapper
    valida esto. Otra pregunta, tienes tu código en algun repo donde lo pueda ver?

    John Soto

    John Soto

    studenthace 4 años

    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

    Daniel Felipe

    studenthace 4 años

    mira lo que dice el error, dice que esta buscando un bean de tipo

    ProductMapper
    en la clase
    ProductoRepository
    y no lo encontró. Lo que puede estar pasando es que la clase
    ProductMapper
    no ha sido definida como un component de spring. Intenta anotar el mapper con @Component

Curso de Java Spring

Curso de Java Spring

Construye una API REST con Java Spring para gestionar productos en un supermercado. Aprende a mapear objetos, manejar bases de datos con Spring Data, y aplicar principios de desarrollo profesional. Expone y controla servicios usando Swagger y Heroku. Ideal para profundizar en el desarrollo de aplicaciones empresariales robustas y seguras.

Curso de Java Spring
Curso de Java Spring

Curso de Java Spring

Construye una API REST con Java Spring para gestionar productos en un supermercado. Aprende a mapear objetos, manejar bases de datos con Spring Data, y aplicar principios de desarrollo profesional. Expone y controla servicios usando Swagger y Heroku. Ideal para profundizar en el desarrollo de aplicaciones empresariales robustas y seguras.