Исключение UnsatisfiedDependencyException, Ошибка при создании компонента с именем

#spring-boot #spring-mvc #model-view-controller #spring-repositories

Вопрос:

когда я пытаюсь запустить приложение, я получаю следующее сообщение:

орг.пружинная конструкция.фасоль.фабрика.Исключение UnsatisfiedDependencyException: Ошибка при создании компонента с именем «productServiceImpl», определенным в файле [C:UsersAcasa ПДД Proiecte practiceattentive2detailstargetclassescomexampleattentive2detailsServiceProductServiceImpl.class]: Неудовлетворенная зависимость, выраженная через параметр конструктора 0; вложенным исключением является org.springframework.beans.factory.Исключение BeanCreationException: Ошибка при создании компонента с именем «ProductRepository», определенным в com.example.attentive2details.репозитории.ProductRepository, определенный в @EnableJpaRepositories, объявленный в JpaRepositoriesRegistrar.Конфигурация EnableJpaRepositoriesConfiguration: Не удалось вызвать метод инициализации; вложенным исключением является org.springframework.data.repository.запрос.Исключение QueryCreationException: Не удалось создать запрос для общедоступного абстрактного java.util.Список com.пример.attentive2details.репозитории.ProductRepository.findByNameStartingWith(java.util.List)! Имя свойства для типа Produs не найдено!

Это происходит с тех пор, как я добавил новый метод List<Produs> findByNameStartingWith(List<Produs> string) в ProductRepository .

Код приложения является:

 @Data
@Table
@Entity
@AllArgsConstructor
@NoArgsConstructor


public class Product {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Integer id;
    @Column
    private String produs;
    @Column
    private Float calories;
}



@Repository

public interface ProductRepository extends JpaRepository<Product, Integer> {

   List<Product> findByNameStartingWith(List<Product> string);
 
}


public interface ProductService {

    List<Product> findByNameStartingWith(List<Product> string);
    
}


@Service

public class ProductServiceImpl implements ProductService {

    ProductRepository productRepository;

    public ProductServiceImpl(ProductRepository productRepository) {
        this.productRepository = productRepository;
    }
    
    @Override
    public List<Product> findByNameStartingWith(List<Product> string) {
        return productRepository.findByNameStartingWith(string);
    }
}


@RequestMapping("/api")
@RestController

public class ProductController {

    private final ProductService productService;

    public ProductController(ProductService productService) {
        this.productService = productService;
    }


    @GetMapping("findProductbyNameStartingWith/produs")
    @Query("FROM Product p WHERE p.produs LIKE %:name%")
    public List<Product> findProductsbyNameStartingWith(@Param("name") String beginswith) {
        List<Product> allproducts = new ArrayList<>( productService.findAll());
        List<Product> productsListBeginWith = new ArrayList<>();
        for (Product product : allproducts) {
            if(product.getProdus().startsWith(String.valueOf(beginswith))){
                productsListBeginWith.add(product);
            }
        }
        return productService.findByNameStartingWith(productsListBeginWith);
    }
}
 

структура приложения

Ответ №1:

Как указано в вашем журнале

com.пример.attentive2details.репозитории.ProductRepository.findByNameStartingWith(java.util.List)! Имя свойства для типа Produs не найдено!

Вы написали findByNameStartingWith , но name в вашей модели нет поля. Jpa не смог найти это свойство в вашем классе сущностей. Вы должны поместить name свойство в свою модель или изменить запрос на другое поле, например findByProdusStartingWith , или findByCaloriesStartingWith .

Ответ №2:

В дополнение к ответу @Faramarz Afzali (который на самом деле правильный), пожалуйста, обратите внимание, что следующее @Query не имеет никакого эффекта:

 @RequestMapping("/api")
@RestController
public class ProductController {
    (...)

    @GetMapping("findProductbyNameStartingWith/produs")
    @Query("FROM Product p WHERE p.produs LIKE %:name%")
    public List<Product> findProductsbyNameStartingWith(@Param("name") String beginswith)
    
    (...)
}
 

@Query должен использоваться в методах репозитория, а не на Контроллере или Службе.