IllegalArguementException и BeanCreationException: не найдено свойство для ошибки типа - PullRequest
0 голосов
/ 14 октября 2019

Я выполнил поиск в Интернете и попытался предложить некоторые исправления, но мое приложение не запустилось. Он не выдает свойства для исключения типа, а также UnsatisfiedDependencyException: Ошибка при создании компонента.

При попытке запустить код появляется сообщение Причина: java.lang.IllegalArgumentException: не удалось создать запрос для метода public abstract java.math.BigDecimal com.Wallet.Repository.TransactionRepository.getBalance (java.lang.Long)! Не найдено свойство getBalance для типа Транзакция

Это код модели:

  @Entity
public class Transaction {

    @Id
    @GeneratedValue
    private Long id;

    private BigDecimal amount;

    private java.util.Date transactionDate;

    private Long  transactionReference;

    private String details;

    @ManyToOne
    private UserWallet wallet;

    public Transaction() {
        super();
    }

Репозиторий

@Repository
public interface TransactionRepository extends CrudRepository <Transaction, Long>

{
    Optional<Transaction> getTransactionByRef(Long reference)throws UserNotFoundException;

    BigDecimal balanceByUserAccountID(Long accountId);

    List<Transaction> transactionsByUserAccountID(Long Id)throws UserNotFoundException;

    Transaction createTransaction(Transaction transaction) throws LowBalanceException;

    BigDecimal getBalance(Long id);

}

ServiceImpl

    @Service
public class TransactionServiceImpl  {

   @Autowired
   private TransactionRepository transRepo;

   public Object transactionByRef(Long reference) throws UserNotFoundException {
       return transRepo.getTransactionByRef(reference).orElseThrow(
               () -> new UserNotFoundException(String.format("transaction with ref '%d' doesnt exist", reference)));
   }
   @Transactional
 public Transaction createTransaction(Transaction transaction) throws LowBalanceException {

       BigDecimal balance = transRepo.getBalance(transaction.getWallet().getId());

       if (balance.add(transaction.getAmount()).compareTo(BigDecimal.ZERO) >= 0) {
           return transRepo.save(transaction);
       }

       throw new LowBalanceException(String.format("user's balance is %.2f and cannot perform a transaction of %.2f ",
               balance.doubleValue(), transaction.getAmount().doubleValue()));
       }

 public BigDecimal balanceByUserAccountID(Long accountId) {

       return transRepo.getBalance(accountId);
   }
 public Iterable<Transaction> getList() {
       return transRepo.findAll();
     }
 public Optional<Transaction> transactionsByUserAccountID(Long txnRef) throws UserNotFoundException  {
       return transRepo.getTransactionByRef(txnRef);
   }
   public Iterable<Transaction> transactions() {
       return transRepo.findAll();
   }

}

Контроллер

@RestController
@RequestMapping("v1/addMoney")
public class TransactionController {
@Autowired
private UserAccountServiceImp userRepo;

       @Autowired
       private TransactionServiceImpl transactRepo;

       @PostMapping("/{id}")
        public ResponseEntity addMoney(@PathVariable("id") Long userAccountId, @RequestBody TransactionDTO walletDTO) {

           Transaction saved;

           try {
                walletDTO.setUserAccountId(userAccountId);
                saved = transactRepo.createTransaction(TransactionMapper.dtoToDO(walletDTO));
            } catch (LowBalanceException ex) {
                Logger.getLogger(UserController.class.getName()).log(Level.SEVERE, null, ex);
                return new ResponseEntity<String>(ex.getMessage(), HttpStatus.BAD_REQUEST);
            } catch (Exception ex) {
                Logger.getLogger(UserController.class.getName()).log(Level.SEVERE, null, ex);
                return new ResponseEntity<String>(ex.getMessage(), HttpStatus.BAD_REQUEST);
            }
            return new ResponseEntity<TransactionDTO>(TransactionMapper.doToDTO(saved), HttpStatus.CREATED);

       }


       @GetMapping("v1/balance/{id}")
       public  BigDecimal getBalance(@PathVariable Long userAccountId){

             return transactRepo.balanceByUserAccountID(userAccountId);
          }
    }

1 Ответ

0 голосов
/ 15 октября 2019

Репозиторий данных Spring делает много магии под капотом. Если у вас есть метод с именем getBalance, определенный в интерфейсе репозитория, он ожидает, что вы пытаетесь получить значение столбца balance от объекта с именем Transaction.

Просто добавьте поле с именемbalance в вашем классе сущностей, и вы должны быть хорошими:

@Entity
public class Transaction {

    @Id
    @GeneratedValue
    private Long id;

    private BigDecimal amount;

    private java.util.Date transactionDate;

    private Long  transactionReference;

    private String details;

    private BigDecimal balance;

    @ManyToOne
    private UserWallet wallet;

    public Transaction() {
        super();
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...