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方法,所以可以正常拿到请求传过来的值。
解决方法
- 给
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
相关产品推荐
相关产品推荐

