无法从 START_OBJECT 令牌中反序列化 `java.lang.Long` 的实例;在 Spring Boot 帖子上

Posted

技术标签:

【中文标题】无法从 START_OBJECT 令牌中反序列化 `java.lang.Long` 的实例;在 Spring Boot 帖子上【英文标题】:Cannot deserialize instance of `java.lang.Long` out of START_OBJECT token; on Spring boot post 【发布时间】:2021-03-02 06:28:35 【问题描述】:

我想从我的 Angular 应用程序向我的 Spring Boot 后端发布一个新游戏。 我是通过 Angular 的一篇文章来做到这一点的。该游戏与我在 Spring Boot JPA 中的用户实体有关系。但是当我发布我的帖子时,我在控制台中收到一个 400 错误代码,上面写着:

"MethodArgumentNotValidException","fieldErrors":["field":"user","errorCode":"NotNull"]

这是我帖子中的数据:

category: "sport", sessieId: 20004, userID: 10004, score: null

我的游戏controller

@CrossOrigin(origins = "*", allowedHeaders = "*")
@RestController
@RequestMapping(value = "/api/games", produces = MediaType.APPLICATION_JSON_VALUE)
public class GameController 

@PostMapping
    @ResponseStatus(HttpStatus.CREATED)
    public Long createGame(@RequestBody @Valid final GameDTO gameDTO) 
        return gameService.create(gameDTO);
    
 // more methods for http

我的游戏domain:

@Entity
public class Game 

    @Id
    @Column(nullable = false, updatable = false)
    @SequenceGenerator(name = "primary_sequence", sequenceName = "primary_sequence",
            allocationSize = 1, initialValue = 10000)
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "primary_sequence")
    private Long id;

    @Column(nullable = false)
    private Integer sessieId;

    @Column(nullable = false)
    private String category;

    @Column
    private String score;

    @ManyToOne
    @JoinColumn(name = "user_id", nullable = false)
    private User user;

我的游戏DTO

public class GameDTO 

    private Long id;

    @NotNull
    private Integer sessieId;

    @NotNull
    @Size(max = 255)
    private String category;

    @Size(max = 255)
    private String score;

    @NotNull
    private Long user;

我的游戏service中的create方法:

public Long create(final GameDTO gameDTO) 
        final Game game = new Game();
        mapToEntity(gameDTO, game);
        return gameRepository.save(game).getId();
    

所以我看到游戏实体期望用户很长,所以我尝试在游戏帖子中发布对象用户。 帖子正文:

category: "sport", sessieId: 20004,…
category: "sport"
score: null
sessieId: 20004
user: id: 10004, firstName: "test5", lastName: "test5", email: "test5@test.nl", password: "test"

然后我得到以下错误:

JSON 解析错误:无法从 START_OBJECT 令牌中反序列化 java.lang.Long 的实例;

我需要在帖子中传递用户对象吗?那么我该如何解决这个错误呢?

【问题讨论】:

id: 10004, ... 不是有效的 JSON。键需要引用 【参考方案1】:

GameDTO 类中用户的类型不正确。它是“Long”类型,但post json中的“用户”是一个对象。

public class GameDTO 

    private Long id;

    @NotNull
    private Integer sessieId;

    @NotNull
    @Size(max = 255)
    private String category;

    @Size(max = 255)
    private String score;

    @NotNull
    private User user;

【讨论】:

以上是关于无法从 START_OBJECT 令牌中反序列化 `java.lang.Long` 的实例;在 Spring Boot 帖子上的主要内容,如果未能解决你的问题,请参考以下文章

无法从 START_OBJECT 令牌中反序列化 java.util.ArrayList 的实例

无法读取文档:无法从 START_OBJECT 令牌中反序列化 java.lang.String 的实例

JSON 解析错误:无法从 START_OBJECT 令牌中反序列化 `byte[]` 的实例

JSON 解析错误:无法从 START_OBJECT 令牌中反序列化 java.util.ArrayList 的实例

com.fasterxml.jackson.databind.exc.MismatchedInputException:无法从 START_OBJECT 令牌中反序列化 `java.util.Arra

无法从 START_OBJECT 令牌中反序列化 `java.lang.Long` 的实例;在 Spring Boot 帖子上