java.lang.IllegalArgumentException: не удалось создать метод запроса в JpaRepository - PullRequest
0 голосов
/ 30 июня 2018

Я использую технологии jpa, hibernate, spring boot - data, api REST.

У меня следующая ошибка:

org.springframework.beans.factory.UnsatisfiedDependencyException: Ошибка создания компонента с именем «walletRestService»: неудовлетворенная зависимость, выраженная через поле «walletRepository»; вложенное исключение - org.springframework.beans.factory.BeanCreationException: ошибка создания бина с именем «walletRepository»: сбой вызова метода init; вложенное исключение - java.lang.IllegalArgumentException: не удалось создать метод запроса. public abstract java.lang.Long com.wj.dao.WalletRepository.createWallet (java.lang.Long, java.lang.String)! Не найдено свойство createWallet для типа Wallet!

Вот мой код:

Пользователь сущности:

package com.wj.entities;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;

import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.OneToMany;

import com.fasterxml.jackson.annotation.JsonManagedReference;

@Entity
public class User implements Serializable{

@Id
@GeneratedValue
private Long id; 
private String name;

@OneToMany(mappedBy="user", fetch=FetchType.LAZY)
@JsonManagedReference
private List<Wallet> wallets = new ArrayList<>();

public User() {
    super();
}

public User(String name) {
    super();
    this.name = name;
}



public User(Long id, String name) {
    super();
    this.id = id;
    this.name = name;
}



public User(Long id, String name, List<Wallet> wallets) {
    super();
    this.id = id;
    this.name = name;
    this.wallets = wallets;
}

public Long getId() {
    return id;
}

public void setId(Long id) {
    this.id = id;
}

public String getName() {
    return name;
}

public void setName(String name) {
    this.name = name;
}

public List<Wallet> getWallets() {
    return wallets;
}

public void setWallets(List<Wallet> wallets) {
    this.wallets = wallets;
}


}

Фирменный кошелек:

@Id
@GeneratedValue
private Long id;
private String name;
@ManyToOne
@JoinColumn(name="user_id")
@JsonBackReference    
private User user;

public Wallet() {
    super();
}




public Wallet(String name, User user) {
    super();
    this.name = name;
    this.user = user;
}




public Wallet(Long id, String name, User user) {
    super();
    this.id = id;
    this.name = name;
    this.user = user;
}



public Long getId() {
    return id;
}

public void setId(Long id) {
    this.id = id;
}

public String getName() {
    return name;
}

public void setName(String name) {
    this.name = name;
}

public User getUser() {
    return user;
}

public void setUser(User user) {
    this.user = user;
}


}

restApi:

@RequestMapping(value="/wallets", method=RequestMethod.POST)
public Wallet save(@RequestBody Wallet wallet) {
    User user = wallet.getUser();

    Long id = walletRepository.createWallet(user.getId(), wallet.getName());
    User boundUser = wallet.getUser();
    User simpleUser = new User(boundUser.getId(), boundUser.getName());
    wallet = new Wallet(id, wallet.getName(), simpleUser);
    return walletRepository.save(wallet);
}

DAO:  

package com.wj.dao;
import org.springframework.data.jpa.repository.JpaRepository;
import com.wj.entities.Wallet;

public interface WalletRepository extends JpaRepository<Wallet, Long>{
   Long createWallet(Long id, String name);
}

Ответы [ 2 ]

0 голосов
/ 30 июня 2018

Пытаясь сделать, как вы сказали, он показывает мне следующую ошибку:

org.springframework.beans.factory.BeanCreationException: Ошибка создания компонента с именем entityManagerFactory, определенным в ресурсе пути к классу [org / springframework / boot / autoconfigure / orm / jpa / HibernateJpaAutoConfiguration.class]: сбой вызова метода init; вложенным исключением является org.hibernate.AnnotationException: коллекция не имеет ни универсального типа, ни определенного OneToMany.targetEntity (): com.wj.entities.User.wallets

WalletRepository: DAO

public interface WalletRepository extends JpaRepository<Wallet, Long>{

Long save(Long id, String name);

 } 

RestService:

@RequestMapping(value="/wallets", 
method=RequestMethod.POST)
public Wallet save(@RequestBody Wallet wallet) {
    User user = wallet.getUser();

    Long id = walletRepository.save(user.getId(), wallet.getName());
    User boundUser = wallet.getUser();
    User simpleUser = new User(boundUser.getId(), boundUser.getName());
    wallet = new Wallet(id, wallet.getName(), simpleUser);
    return walletRepository.save(wallet);
}

Сущность: пользователь Я изменил:

@OneToMany(mappedBy="user", fetch=FetchType.LAZY)
@JsonManagedReference
private List<? extends Wallet> wallets = new ArrayList<>();
0 голосов
/ 30 июня 2018

Это объявление в вашем WalletRepository интерфейсе недопустимо для Spring:

Long createWallet(Long id, String name);

Как вы хотите, чтобы Spring угадал, какой метод createWallet() предназначен для создания и сохранения сущности Wallet с Long id и String name?

Фактически методы, которые вы объявляете в своем интерфейсе WalletRepository, являются поисковыми методами, которые основаны на соглашениях об именах, которые позволяют Spring создавать запросы для вас. И create не упоминается в документации Spring Data:

4.4.2. Создание запроса

Механизм префиксов полос find…By, read…By, query…By, count…By и get…By из метода и начинает анализ остальной части это.

Поскольку Spring не распознает create, он, вероятно, пытается определить createWallet как поле сущности. Принимая во внимание сообщение:

Не найдено свойство createWallet для типа Wallet!

Чтобы сохранить сущность, используйте метод, указанный в JpaRepository:

<S extends T> S save(S entity);

который для вашего хранилища будет выведен как:

Wallet save(Wallet entity);

Адаптируйте свой клиентский код для создания экземпляра Wallet и передачи его в save().

Например:

@RequestMapping(value="/wallets", method=RequestMethod.POST)
public Wallet save(@RequestBody Wallet wallet) {
    User boundUser = wallet.getUser();
    return walletRepository.save(wallet);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...