如何在 Spring Boot 中从泛型参数(与任何类无关)中获取值

Posted

技术标签:

【中文标题】如何在 Spring Boot 中从泛型参数(与任何类无关)中获取值【英文标题】:How to get values from generic parameter (not related to any class) in Spring boot 【发布时间】:2021-12-08 12:32:15 【问题描述】:

我是 SB 的新手,正在努力提高我的技能。我做了一个小API项目,其中我有账户余额属性的帐号,该项目的目标是将账户余额属性中的金额与相应的帐号相加。

我被困在我需要从实际上不是任何类的一部分的数量变量中获取价值的地步。如果您认为标题不符合主题,任何人都可以更改标题。 我在下面提到的课程,你会发现我的努力是无用的,因为它似乎一团糟。 如果有人能纠正或给我相同问题所在的参考堆栈,我将不胜感激。

帐户.java

    private Long id;
    private int accountNumber;
    private BigDecimal accountBalance;

帐户存储库

 public interface AccountDao extends CrudRepository<Account, Long> 
  Account findByAccountNumber(int accountNumber);
 

账户服务

public interface AccountService 
void deposit(int accountNumber, String accountType, double amount);
 // these fields are not related to class field, I took this to send data to API

AccountServiceImpl

public void deposit(String accountType, int accountNumber, double amount) 
    if (accountType.equalsIgnoreCase("Permanent")) 
        Account account = accountRepository.findByAccountNumber(accountNumber);
        account.setAccountBalance(account.getAccountBalance().add(new 
        BigDecimal(amount)));
        accountDao.save(account);

帐户控制器

 @PostMapping("/deposit")
   public ResponseEntity<Object> depositPost(@RequestBody double amount, String accountType, 
   int accountNumber, Account account)
   accountService.deposit(accountType, accountNumber, 
   Double.parseDouble(String.valueOf(amount)));
   return ResponseEntity.ok("Record has been entered");


我收到的错误是:

  2021-10-21 20:19:58.660  WARN 22892 --- [nio-8088-exec-1] 
  .w.s.m.s.DefaultHandlerExceptionResolver : Resolved 
  [org.springframework.http.converter.HttpMessageNotReadableException: JSON parse error: 
  Cannot deserialize value of type `double` from Object value (token 
  `JsonToken.START_OBJECT`); nested exception is 
  com.fasterxml.jackson.databind.exc.MismatchedInputException: Cannot deserialize value of 
  type `double` from Object value (token `JsonToken.START_OBJECT`)
  at [Source: (PushbackInputStream); line: 1, column: 1]]

【问题讨论】:

也许trying-to-use-spring-boot-rest-to-read-json-string-from-post可以帮助你。 谢谢,但我更想知道如何从变量中获取值。例如,可变金额解析为 100,我需要将其添加到 accountBalance 属性中 不客气,您收到的消息是关于解析 json 错误,您能否添加一个发送给控制器的 json 示例消息? 【参考方案1】:

问题在于您的 POST 正文。我猜你正在发送类似于以下内容:


   "amount": 1000

这是一个 JSON 对象,无法反序列化为简单的double 参数。你需要创建一个对应的类,如下:

public class AccountDto 
   private double amount;

   // constructor, getters, setters

现在您需要在 Controller 中使用它:

@PostMapping("/deposit")
public ResponseEntity<Object> depositPost(@RequestBody AccountDto accountDto, String accountType, int accountNumber, Account account)
    accountService.deposit(accountType, accountNumber, accountDto.getAmount());
    return ResponseEntity.ok("Record has been entered");

【讨论】:

谢谢 Joäo,我收到错误“java.lang.IllegalStateException:可选 int 参数 'accountNumber' 存在,但由于被声明为原始类型,因此无法转换为空值。考虑声明它作为相应原始类型的对象包装器”...... 如果accountNumber可能为空,则需要使用Integer而不是int 感谢 Joäo,它有效,但您有其他解决方案吗?因为我从 Postman accountNumber、accountType 和 amount 发送了三个值。所以我不得不像这样更改控制器,只要告诉我这是否是正常方式?:::::: public ResponseEntity depositPost(@RequestBody AccountDto accountDto) accountService.deposit(accountDto.getAccountType(), accountDto. getAccountNumber(), accountDto.getAmount()); 是的,这是正确的做法。

以上是关于如何在 Spring Boot 中从泛型参数(与任何类无关)中获取值的主要内容,如果未能解决你的问题,请参考以下文章

如何从泛型函数中记录参数[重复]

在 C# 4.0 中,是不是可以从泛型类型参数派生类?

Scala - 从泛型类型获取类对象

如何从泛型类访问静态变量?

从泛型类型快速实例化

如何从泛型函数返回 null? [复制]