为什么报错:Required request parameter 'id' for method parameter type Integer is not present?

这个是我的后端代码

    @PostMapping("/changeStatus")
    public AjaxResult changeStatus(@RequestParam("id") Integer id,@RequestParam("tenantState") String tenantState) {
        if(Objects.isNull(id)){
            return  AjaxResult.error("输入主键id");
        }
        if(Objects.isNull(tenantState)){
            return  AjaxResult.error("输入状态");
        }
        System.out.println("id"+id);
        BTenantInfo bTenantInfo=new BTenantInfo();
        bTenantInfo.setId(id);
        bTenantInfo.setTenantState(tenantState);
        tenantServiceImpl.update(bTenantInfo);
        return AjaxResult.success();
    }

这是我前端API写法

export function changeTenantStatus(id,tenantState) {
    const data = {
        id,
        tenantState
    }
    return request({
        url: '/api/tenant/changeStatus',
        method: 'post',
        data: data
    })
}

这个是浏览器提示:

不能明白错误出在哪里?

阅读 2.5k
avatarAI BotBETA

你遇到的错误“Required request parameter 'id' for method parameter type Integer is not present”通常是因为后端期望通过@RequestParam注解从请求的查询参数(Query Parameters)或表单数据(Form Data)中获取名为id的参数,但在实际请求中并没有找到这样的参数。

然而,在你的前端代码中,你使用了一个POST请求,并且将数据作为请求体(Body)发送(通过data: data),而不是作为查询参数或表单数据。这导致了后端无法从它期望的地方(查询参数或表单数据)找到id参数。

为了解决这个问题,你有两个主要选项:

  1. 修改前端代码以发送表单数据
    如果你希望继续使用@RequestParam来接收参数,你需要确保前端以表单数据的形式发送请求。这通常涉及到设置Content-Typeapplication/x-www-form-urlencoded(对于传统的表单提交)或使用multipart/form-data(对于包含文件的表单)。但是,由于你正在发送JSON数据,这通常不是最佳选择。
  2. 修改后端代码以接收请求体中的数据
    这是更常见和推荐的方法,特别是当你发送JSON数据时。你可以使用@RequestBody注解来接收请求体中的数据,并将其绑定到一个Java对象上。

    修改你的后端代码如下:

    @PostMapping("/changeStatus")
    public AjaxResult changeStatus(@RequestBody Map<String, Object> params) {
        Integer id = (Integer) params.get("id");
        String tenantState = (String) params.get("tenantState");
    
        if (Objects.isNull(id)) {
            return AjaxResult.error("输入主键id");
        }
        if (Objects.isNull(tenantState)) {
            return AjaxResult.error("输入状态");
        }
    
        System.out.println("id: " + id);
        BTenantInfo bTenantInfo = new BTenantInfo();
        bTenantInfo.setId(id);
        bTenantInfo.setTenantState(tenantState);
        tenantServiceImpl.update(bTenantInfo);
        return AjaxResult.success();
    }

或者,更推荐的做法是创建一个DTO(Data Transfer Object)类来接收这些数据:

public class TenantStatusDto {
    private Integer id;
    private String tenantState;

    // getters and setters
}

// 然后在你的controller中使用它
@PostMapping("/changeStatus")
public AjaxResult changeStatus(@RequestBody TenantStatusDto dto) {
    // 验证dto的id和tenantState
    // ...
    // 使用dto.getId()和dto.getTenantState()
}

这样,你就可以直接从请求体中读取JSON数据,并将其绑定到TenantStatusDto对象上。这种方法更加清晰和类型安全。

2 个回答

AI修改方法是正确的。

你的提交是一个放在请求体的json字符串,你不能使用@RequestParam这样接收。
@RequestParam用于从查询字符串和表单参数中提取数据,你需要提供url?id=xxx&tenantState=xxx或者设置contentType=application/x-www-form-urlencoded

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏