#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
должен использоваться в методах репозитория, а не на Контроллере или Службе.