MybatisPlus无法读取@RequestBody的Map参数,怎么解决?

控制器模块

@PutMapping(path = "/update/{id}", consumes = "application/json")
    public HashMap update(
            @PathVariable("id") Long id,
            @RequestBody Map requestBody) {
        System.out.println(id);                        //可以输出值“1”
        System.out.println(requestBody.get("name")); //可以输出值“徐大爷”
        int row = userm.updateUser(requestBody,id);
        HashMap mp = new HashMap();
        mp.put("code",200);
        Object[] objectArray = new Object[0];
        mp.put("data",objectArray);
        return mp;
    }

关联的接口映射

public interface UsersMapper extends BaseMapper<Users> {
     IPage findById(IPage page,@Param("id") Long id);
     int updateUser(@Param("requestBody") Map requestBody,@Param("id") Long id);
}

MybatisPlus的xml文件

<update id="updateUser">
        update users set name = #{requestBody.get("name")} where id=#{id}
    </update>

#{id} 是能获取的,经过测试,如果我写死

<update id="updateUser">
        update users set name = "11112222" where id=#{id}
    </update>

是能更新成功的,因此就是 #{requestBody.get("name")} 的问题,为什么无法获取值呢?

请求传参是

http://localhost:7070/mapper/update/1

传递参数
{
  "name":"徐大爷",
  "id":1
}
阅读 312
avatarAI BotBETA
# 回答

在 MyBatis 中,你不能直接在 XML 映射文件中使用 `#{requestBody.get("name")}` 这样的表达式来访问 Map 中的值。这是因为 MyBatis 的参数解析器无法正确解析这种嵌套或方法调用的表达式。

要解决这个问题,你应该在 Mapper 接口的方法参数中使用 `@Param` 注解来明确指定每个参数的名称,并在 XML 文件中使用这些名称来引用这些参数。由于你已经为 `id` 使用了 `@Param`,你应该为 `requestBody` 中的 `name` 也指定一个参数名称,然后在 XML 中使用这个名称。但是,由于 `requestBody` 是一个 Map,更直接的方法是将其展开为多个参数,或者直接在 Mapper 接口的方法中处理这个 Map。

这里有一个更简洁的解决方案:

1. **修改 Mapper 接口**:将 `Map` 类型的参数展开为具体的字段,例如 `String name`。

public interface UsersMapper extends BaseMapper<Users> {

IPage findById(IPage page, @Param("id") Long id);
int updateUser(@Param("name") String name, @Param("id") Long id);

}


2. **修改 XML 文件**:使用 `#{name}` 来引用传递的 `name` 参数。

<update id="updateUser">

update users set name = #{name} where id=#{id}

</update>


3. **修改控制器**:在控制器中从 `Map` 中提取 `name` 并传递给 `updateUser` 方法。

@PutMapping(path = "/update/{id}", consumes = "application/json")
public HashMap<String, Object> update(

    @PathVariable("id") Long id,
    @RequestBody Map<String, Object> requestBody) {
String name = (String) requestBody.get("name");
int row = userm.updateUser(name, id);
HashMap<String, Object> mp = new HashMap<>();
mp.put("code", 200);
mp.put("data", new Object[0]);
return mp;

}


这样,你就可以正确地从 `@RequestBody` 读取 `name` 并将其更新到数据库中。
2 个回答

MybatisPlus的xml文件,MyBatis 不支持直接在 XML 中调用 Map 的 get 方法
#{requestBody.get("name")} 改为 #{requestBody.name}

<update id="updateUser">
    update users set name = #{requestBody.name} where id=#{id}
</update>
新手上路,请多包涵
<update id="updateUser">
        update users set name = #{requestBody.name} where id=#{id}
</update>
推荐问题
宣传栏