JAX-RS PUT接口反序列化报错:无法将Object转为java.lang.Long
问题:PUT接口反序列化失败,无法将JSON对象转为Long类型
错误信息
Cannot deserialize value of type
java.lang.Longfrom Object value (tokenJsonToken.START_OBJECT)
at [Source: (io.undertow.servlet.spec.ServletInputStreamImpl); line: 1, column: 1
]
代码片段
接口服务代码
@PUT @Path("/{bookId}") public Response editBook(@PathParam("bookId") Long bookId, Book newBook) { if (!JWTTokenAuth.validateJwtToken(JWTTokenAuth.extractTokenFromHeaders(headers))) { return Response.status(Response.Status.UNAUTHORIZED).build(); } Book book = bookDao.getBookById(bookId); if (book == null) { return Response.status(Response.Status.NOT_FOUND).build(); } book.setTitle(newBook.getTitle()); bookDao.updateBook(book); return Response.ok().build(); }
Book实体类代码
@Entity @Getter @Setter public class Book { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; private String title; private String author; @OneToMany(mappedBy = "book") private List<Review> reviews; }
请求信息
- 请求地址:
http://localhost:8080/api/books/2 - 请求体:
{ "title": "defgefgege" }
问题原因
并非@PathParam的问题,而是请求体绑定逻辑混淆:
在JAX-RS(或Spring整合JAX-RS)环境中,方法多参数时需明确每个参数的来源。bookId通过@PathParam指定来自URL路径,但newBook未标注请求体绑定注解,导致框架错误地尝试将JSON请求体解析为Long类型(对应bookId参数),触发反序列化失败。
解决方案
方案1:添加请求体绑定注解(Spring环境)
在newBook参数前添加@RequestBody注解,明确该参数来自JSON请求体:
@PUT @Path("/{bookId}") public Response editBook(@PathParam("bookId") Long bookId, @RequestBody Book newBook) { // 原有逻辑不变 }
方案2:添加Consumes注解(纯JAX-RS环境)
在方法上添加@Consumes(MediaType.APPLICATION_JSON),指定请求体格式为JSON,确保框架将请求体绑定到实体类参数:
@PUT @Path("/{bookId}") @Consumes(MediaType.APPLICATION_JSON) public Response editBook(@PathParam("bookId") Long bookId, Book newBook) { // 原有逻辑不变 }
内容的提问来源于stack exchange,提问作者Georgios Kourounis
相关产品推荐
相关产品推荐

