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

Postman向Jersey RESTful接口POST JSON对象入库失败问题咨询

问题根因

POST接口收不到JSON请求体是三个直接原因:

  • 现有createUser方法用@QueryParam接参,这个注解只能读取URL问号后面拼接的查询参数,读不到请求体里的JSON数据
  • 接口没加@Consumes(MediaType.APPLICATION_JSON)注解,Jersey不会触发JSON请求体的解析流程
  • 引入的jersey-media-json-jackson版本是2.0,和JDK17兼容性差,也不会自动注册Jackson的JSON解析器,就算加了注解也可能报序列化错误

修复步骤

1. 升级pom.xml中Jersey依赖版本

把所有jersey开头的依赖版本从2.0统一替换为2.39.1,该版本稳定兼容JDK17,会自动注册Jackson的JSON序列化/反序列化组件,不需要额外手动配置Provider。替换后的依赖片段如下:

<dependency>
    <groupId>org.glassfish.jersey.media</groupId>
    <artifactId>jersey-media-json-jackson</artifactId>
    <version>2.39.1</version>
</dependency>
<dependency>
    <groupId>org.glassfish.jersey.containers</groupId>
    <artifactId>jersey-container-servlet-core</artifactId>
    <version>2.39.1</version>
</dependency>
<dependency>
    <groupId>org.glassfish.jersey.core</groupId>
    <artifactId>jersey-client</artifactId>
    <version>2.39.1</version>
</dependency>
<dependency>
    <groupId>org.glassfish.jersey.core</groupId>
    <artifactId>jersey-server</artifactId>
    <version>2.39.1</version>
</dependency>

web.xml不需要修改,现有包扫描配置已经可以正常识别自动注册的Jackson解析器。

2. 重写RestUser中的POST接口方法

把原来用@QueryParam接收参数的createUser方法替换为直接接收User实体的写法,加上@Consumes注解声明接收JSON格式请求体:

@POST
@Path("/insert")
@Consumes(MediaType.APPLICATION_JSON) // 声明接口消费JSON格式请求体
@Produces(MediaType.APPLICATION_JSON)
public User createUser(User newuser) { // 框架会自动把请求体JSON反序列化为User对象
    userDB.insertUser(newuser);
    return newuser; // 插入完成后将用户信息序列化为JSON返回
}

注意:User类已经存在无参构造方法和对应字段的getter/setter,Jackson可以正常完成反序列化,不需要额外加注解。仅建议把setPassword方法里拼写错误的形参passoword改成正确的password,避免后续其他逻辑踩坑。User类上的JAXB注解是处理XML格式用的,不影响JSON解析,不需要删除。

3. 清理UserDB中冗余代码

insertUser方法里三行给自己赋值的代码完全没用,直接删掉,同时加上EntityManager关闭逻辑避免数据库连接泄漏:

public void insertUser(User user) {
    EntityManager entityManager = JPAUtil.getEntityManagerFactory().createEntityManager();
    EntityTransaction entityTransaction = entityManager.getTransaction();
    entityTransaction.begin();
    // 删除下面三行冗余代码
    // user.setUsername(user.getUsername());
    // user.setPassword(user.getPassword());
    // user.setEmail(user.getEmail());
    entityManager.persist(user);
    entityTransaction.commit();
    entityManager.close();
}

4. Postman请求配置

发请求时按以下要求配置即可正常调用:

  • 请求方法选POST,请求地址为http://你的服务地址/UserManagement/rest/users/insert
  • 请求头添加Content-Type: application/json
  • 请求体选择raw格式,类型下拉选JSON,传入目标JSON结构:
{
    "username": "1",
    "password": "2",
    "email": "3"
}

之前注释掉的硬编码POST接口能正常运行,是因为所有参数都是代码内部写死的,没有走外部请求参数解析流程,和JSON反序列化逻辑无关。上述修改完成后重启服务,即可正常接收请求体JSON写入数据库。

内容的提问来源于stack exchange,提问作者g.mae

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 01:27:27