You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

JAX-RS(RestEasy)更新用户时请求传递的id变为0如何解决

你遇到的id始终为0的问题,根因是User实体类没有提供id字段的setter方法。
你贴出的User类代码中,仅声明了getId()方法读取id值,没有对应的setId()方法给id赋值。JAX-RS的JSON反序列化框架在解析请求体中的JSON参数时,需要通过setter方法给实体类的字段赋值,没有setter的字段就会保持默认值,int类型的默认值就是0,所以你拿到的id始终为0,而username有对应的setter方法,所以可以正常拿到请求传过来的值。

解决方法

  1. 给User类补充id的setter方法即可解决反序列化问题:
public void setId(int id) {
    this.id = id;
}

其他优化建议

  • 你的DAO层EntityManager使用方式存在问题:@PersistenceContext是容器注入注解,你同时手动调用factory.createEntityManager()创建EntityManager的写法完全错误,如果你的服务运行在JavaEE/Spring容器中,直接删除手动创建EntityManagerFactory和EntityManager的代码,由容器注入EntityManager即可;如果是独立运行的程序,需要每次操作都创建新的EntityManager,操作完成后调用em.close()关闭,避免连接泄漏。
  • 现有更新、删除逻辑存在隐患:当前update方法先查旧对象再赋值合并的逻辑可以正常运行,但你可以直接合并前端传入的User对象,减少一次查询。delete方法直接删除前端传入的游离态User对象可能抛出异常,建议先按传入的id查询到持久态对象后再执行删除操作。
  • 关于DTO/Mapper:当前简单场景下可以不用额外加DTO层,如果你后续需要隐藏实体类的内部字段(比如密码、内部状态字段),或者前端交互字段和实体字段差异较大时,再引入DTO和Mapper做字段映射即可。
  • 接口设计可以更符合REST规范:更新操作建议用PUT方法,删除操作用DELETE方法,更符合通用的接口设计约定。

内容的提问来源于stack exchange,提问作者Ray09

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 04:36:09