Spring MVC 中因导入错误的 Model 类报错问题解析

209 阅读2分钟

Spring MVC 中因导入错误的 Model 类报错问题解析

在 Spring MVC或 Spring Boot 项目中,常要用到 org.springframework.ui.Model 来向前端传递数据。然而,如果你不小心导入了错误的 Model 类,就会出现无法解析方法的错误。

image.png 以下是一个类似情况的例子:

错误现象

在一个 Spring Controller 类中,你实现了下面的代码:

import ch.qos.logback.core.model.Model;
import org.springframework.web.bind.annotation.*;
import org.springframework.stereotype.Controller;

@Controller
public class PaymentController {

    @GetMapping("/new")
    public String showPaymentPage(@RequestParam Long saleId, Model model) {
        model.addAttribute("saleId", saleId);
        return "payment";
    }
}

但是,在 IDE 中出现了以下报错:

无法解析 Model 类中的 addAttribute 方法

原因分析

解释举例中的错误:

  1. 导入了错误的 Model: 你导入的是 Logback 框架中的 ch.qos.logback.core.model.Model ,这个类并不是 Spring 提供的。因此,在 IDE 中无法找到 addAttribute 方法。
  2. Spring 正确的 Model 类是不同的包: Spring MVC 提供的 Model 类是 org.springframework.ui.Model ,这是一个用于前后端传递数据的接口。
  3. IDE和构建系统的自动导入: 在使用 IDE (如 IntelliJ IDEA)时,对于符合条件的类,IDE会自动导入最先匹配到的类。如果你导入过 Logback 相关的包,IDE 就可能会优先导入这个错误的 Model

解决方案

  1. 删除错误导入 删除这个错误的导入:

    import ch.qos.logback.core.model.Model; // 删除这个
    
  2. 导入正确的 Model 加上 Spring MVC 提供的导入:

    import org.springframework.ui.Model;
    
  3. 验证正确导入 确保导入后,在 IDE 中重新构建项目:

    • Maven 项目:运行 mvn clean install 或重新加载依赖。
    • Gradle 项目:运行 gradle clean build 或刷新依赖。
  4. 清理 IDE 缓存 如果 IDE 仍然报错:

    • 重新实现:关闭并重新打开项目。
    • 清理缓存:IntelliJ IDEA 中,进入 File -> Invalidate Caches / Restart 操作。

完整例子

正确的代码如下:

package com.example.conveniencepos.controller;

import com.example.conveniencepos.entity.Payment;
import com.example.conveniencepos.service.PaymentService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.*;

@Controller
public class PaymentController {

    @Autowired
    private PaymentService paymentService;

    @GetMapping("/new")
    public String showPaymentPage(@RequestParam Long saleId, Model model) {
        model.addAttribute("saleId", saleId);
        return "payment";
    }

    @PostMapping("/makePayment")
    public String makePayment(@RequestParam Double amount,
                              @RequestParam String method,
                              @RequestParam Long saleId,
                              Model model) {
        Payment payment = paymentService.createPayment(amount, method, saleId);
        model.addAttribute("payment", payment);
        return "paymentSuccess";
    }
}

总结

这种错误的根本原因是不小心导入了不相关的类。在开发 Spring MVC 或 Spring Boot 项目时,需要特别注意正确导入包,尽量避免 IDE 自动导入不对的类。