【问题标题】:JsonMappingException: Can not construct instance ofJsonMappingException:无法构造实例
【发布时间】:2018-02-04 11:19:49
【问题描述】:

我有一个实体,其中两列引用其他表中的同一列。基本上,交易取决于账户:在创建新交易时,从一个账户向另一个账户汇款。

帐号:

@Entity
@Table(name = "accounts")
public class Account implements java.io.Serializable {

    private static final long serialVersionUID = 2612578813518671670L;

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "idaccount", unique = true, nullable = false)
    private Long idaccount;

    @Column(name = "name", length = 50)
    private String name;

    @NotNull
    @ManyToOne
    @JoinColumn(name = "iduser")
    private User user;

...

交易:

@Entity
@Table(name = "transactions")
public class Transaction {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "idtransaction", unique = true, nullable = false)
    private Long idtransaction;

    private BigDecimal amount;

    @NotNull
    @ManyToOne
    @JoinColumn(name = "SOURCE_ACCOUNT")
    private Account sourceAccount;

    @NotNull
    @ManyToOne
    @JoinColumn(name = "TARGET_ACCOUNT")
    private Account targetAccount;

...

事务控制器

@CrossOrigin
@RestController
@RequestMapping("/transaction")
public class TransactionController {

    @Autowired
    TransactionService transactionService;

    @RequestMapping(method = RequestMethod.POST)
    public ResponseEntity<Transaction> addTransaction(@RequestBody Transaction Transaction) {
        transactionService.save(Transaction);

        return new ResponseEntity<Transaction>(Transaction, HttpStatus.CREATED);
    }

...

如果我尝试发布交易来创建交易(当然我已经创建了帐户):

{
"amount": 111,
"sourceAccount": 1,
"targetAccount": 2
}

我明白了:

Failed to read HTTP message: org.springframework.http.converter.HttpMessageNotReadableException: Could not read document: Can not construct instance of com.mycompany.basicbank.model.Account: no int/Int-argument constructor/factory method to deserialize from Number value (1)
 at [Source: java.io.PushbackInputStream@63447acf; line: 3, column: 18] (through reference chain: com.mycompany.basicbank.model.Transaction["sourceAccount"]); nested exception is com.fasterxml.jackson.databind.JsonMappingException: Can not construct instance of com.mycompany.basicbank.model.Account: no int/Int-argument constructor/factory method to deserialize from Number value (1)
 at [Source: java.io.PushbackInputStream@63447acf; line: 3, column: 18] (through reference chain: com.mycompany.basicbank.model.Transaction["sourceAccount"])

所以我的问题是:我应该检查什么以修复“无法构造 com.livingit.basicbank.model.Account 的实例:没有从 Number 反序列化的 int/Int-argument 构造函数/工厂方法”?

【问题讨论】:

  • JSON 中的错误与 JPA API 无关。他们扮演着完全不同的角色。

标签: spring hibernate jpa spring-data-jpa


【解决方案1】:

问题是您发送的 json 与 Transaction 类不完全匹配。因此您会看到错误。
但是你想要实现的是一个有效的场景,并且可以完成。

一些选项。

  1. 创建一个与 json 匹配的新类(不是 Transaction)。喜欢

    class TransactionClient {
       BigDecimal amount,
       Long sourceAccount,
       Long targetAccount
    }
    

并且在后端(控制器或某些服务中),您可以使用此 sourceAccount 和 targetAccount 从数据库中获取帐户,并使用此对象创建一个事务对象并保存。

  1. 从前端调用后端获取这些源帐户和目标帐户的 Accounts(json),然后像这样使用 json 调用您的事务端点

    {
      "amount": 111,
      "sourceAccount":  {
        "idaccount" :123123,
         ..... // All the Non Null fields
       },
      "targetAccount": {
        "idaccount" :45554,
         ..... // All the Non Null fields
       },
     }
    

【讨论】:

  • 您也可以创建自己的JsonDeserializer&lt;Transaction&gt; 并使其更加灵活(只是处理这种情况的第三种方法)
猜你喜欢
  • 2014-08-28
  • 1970-01-01
  • 2020-03-27
  • 2016-07-09
  • 1970-01-01
  • 1970-01-01
  • 2012-09-26
  • 2021-07-17
  • 1970-01-01
相关资源
最近更新 更多