1. 现象说明
执行接口方法,抛出异常No primary or single unique constructor found for interface javax.servlet.http.HttpServletRequest
@GetMapping("/captcha") public void getCaptcha(HttpServletRequest request, HttpServletResponse response) { String captchaText = defaultKaptcha.createText(); log.info("图形验证码:{}", captchaText); // 存储 redisTemplate.opsForValue().set(getCaptchaKey(request), captchaText, CAPTCHA_CODE_EXPIRED, TimeUnit.MILLISECONDS); BufferedImage bufferedImage = defaultKaptcha.createImage(captchaText); try (ServletOutputStream outputStream = response.getOutputStream()) { ImageIO.write(bufferedImage, "jpg", outputStream); outputStream.flush(); } catch (IOException e) { log.error("获取图形验证码异常:", e); } }2. 解决方法
将所有javax.servlet.*导入语句替换为jakarta.servlet.*
// 错误示例 import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; // 正确示例 import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse;3. 原因说明
- Spring Boot 3+ 基于Jakarta EE 9+,彻底弃用
javax.*命名空间,改用jakarta.* - 当代码或依赖库仍使用
javax.servlet时,Spring无法实例化接口,抛出IllegalStateException。