SpringBoot+Thymeleaf报错:无法将favicon.ico转为long类型,职位无法入库
职位注册系统CRUD问题排查与解决
问题概述
这是一个基于SpringBoot、Thymeleaf、MySQL、Maven开发的模拟职位注册CRUD系统。注册新职位时,控制台抛出类型转换警告,且职位数据无法存入MySQL数据库。
控制台警告信息
2024-04-13T18:42:03.089-03:00 WARN 1496 --- [AppRh] [nio-8080-exec-9] .w.s.m.s.DefaultHandlerExceptionResolver : Resolved [org.springframework.web.method.annotation.MethodArgumentTypeMismatchException: Failed to convert value of type 'java.lang.String' to required type 'long'; For input string: "favicon.ico"]
页面代码
<!DOCTYPE html> <html lang=”pt-br” xmlns:th="http://thymeleaf.org" xmlns:layout="http://www.ultraq.net.nz/thymeleaf/layout"> <head> <meta charset="utf-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1"> <title>| App RH - UC 12 |</title> <!-- Bootstrap --> <link href="bootstrap/css/bootstrap.min.css" rel="stylesheet"> </head> <body> <header> <nav class="navbar navbar-expand-lg navbar-dark bg-dark"> <div class="container-fluid"> <a class="navbar-brand" href="/">App RH</a> <button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#navbarNav" aria-controls="navbarNav" aria-expanded="false" aria-label="Toggle navigation"> <span class="navbar-toggler-icon"></span> </button> <div class="collapse navbar-collapse" id="navbarNav"> <ul class="navbar-nav"> <li class="nav-item"><a class="nav-link active" aria-current="page" href="#">Home</a></li> <a class="nav-link" href="/vagas"> << Listar Vagas>> </a> </li> <li class="nav-item"><a class="nav-link" href="/cadastrarVaga"> << Cadastrar Vaga>> </a></li> </ul> </div> </div> </nav> </header> <div class="container"> <h1>Cadastrar vaga</h1> <br> <th:block th:insert="~{mensagemValidacao}"></th:block> <form method="post"> <div class="form-group"> <label for=""><b>Nome do cargo:</b> </label> <input type="text" class="form-control" value="" placeholder="Insira o nome do cargo" name="nome" required> <small class="form-text text-muted"><i>* Utilize nomes e termos mais utilizados no mercado.</i></small> </div> <div class="row"> <div class="col"> <div class="form-group"> <label for=""><b>Data de expiração:</b></label> <input type="date" value="" name="data" class="form-control" required /> <small class="form-text text-muted"><i>* Data em que a vaga expira.</i></small> </div> </div> <div class="col"> <div class="form-group"> <label for=""><b>Salário:</b></label> R$ <input type="number" pattern="^\d+(\.|\,)\d{2}$" value="" name="salario" class="form-control" required /> <small class="form-text text-muted"><i>* Utilize valores considerando vírgula e ponto.</i></small> </div> </div> </div> <div class="form-group"> <label for=""><b>Descrição da vaga:</b></label> <textarea class="form-control" name="descricao" maxlength="254" rows="3" required></textarea> <small class="form-text text-muted"><i>* Breve resumo da vaga oferecida..</i></small> </div> <button type="submit" class="btn btn-success">Adicionar Vaga</button> </form> </div> <div style="height: 100px;"></div> <div class="footer-copyright fixed-bottom bg-dark text-center py-3"> <span class="text-light align-middle">| App RH - UC 12 | - © 2022 Copyright: CTM Supervisão de Educação Online</span> </div> <!--JavaScript bootstrap--> <script type="text/javascript" src="bootstrap/js/bootstrap.js"></script> <script src="https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/js/bootstrap.bundle.min.js" integrity="sha384-ka7Sk0Gln4gmtz2MlQnikT1wXgYsOg+OMhuP+IlRH9sENBO0LRn5q+8nbTov4+1p" crossorigin="anonymous"> </script> </body> </html>
控制器代码
@Autowired private VagaRepository vr; @Autowired private CandidatoRepository cr; @RequestMapping(value = "/cadastrarVaga", method = RequestMethod.GET) public String form() { return "vaga/formVaga"; } @RequestMapping(value = "/cadastrarVaga", method = RequestMethod.POST) public String form(@Valid Vaga vaga, BindingResult result, RedirectAttributes attributes) { if (result.hasErrors()) { attributes.addFlashAttribute("mensagem", "Verifique os campos!"); return "redirect:/cadastrarVaga"; } vr.save(vaga); attributes.addFlashAttribute("mensagem", "Vaga cadastrada com sucesso!"); return "redirect:/cadastrarVaga"; }
问题原因分析
1. favicon.ico类型转换警告
浏览器会自动请求根目录下的favicon.ico图标,如果项目中存在匹配/{id}这类接收long类型参数的GET接口,浏览器请求/favicon.ico时会把字符串"favicon.ico"当作id参数传入,触发String转long的类型转换失败,抛出警告。
2. 职位无法存入数据库的可能原因
- 表单字段与
Vaga实体类属性不匹配:比如表单日期字段name="data",但实体类对应属性名称/类型不一致(例如实体类用LocalDate但表单格式不兼容); Vaga实体类缺少JPA注解,无法正确映射到数据库表;- 表单未指定明确的提交路径,导致请求映射异常;
- 参数绑定失败(
BindingResult存在错误但未输出具体信息); - 数据库连接配置错误,或者事务未正确提交。
解决方法
针对favicon.ico警告
- 在
src/main/resources/static目录下添加favicon.ico图标,避免浏览器发起无效请求; - 添加专门的接口处理favicon请求:
@RequestMapping("/favicon.ico") @ResponseBody public void favicon() { // 空实现,返回204状态码忽略请求 }
- 在全局异常处理器中捕获
MethodArgumentTypeMismatchException,过滤favicon相关请求,避免打印警告。
针对职位无法存入数据库
检查
Vaga实体类:- 确保实体类字段与表单
name属性完全一致,比如nome、data、salario、descricao对应实体类同名属性; - 日期字段用
LocalDate类型,SpringBoot默认支持yyyy-MM-dd格式绑定; - 金额字段建议用
BigDecimal避免浮点精度问题; - 添加必要的JPA注解:
@Entity、@Table,主键字段添加@Id、@GeneratedValue。
- 确保实体类字段与表单
完善表单提交配置:
在form标签中明确提交路径,确保请求正确映射到POST接口:
<form method="post" th:action="@{/cadastrarVaga}">
- 调试参数绑定错误:
在POST接口中打印BindingResult的具体错误信息,定位参数绑定失败原因:
if (result.hasErrors()) { result.getAllErrors().forEach(error -> System.out.println(error.getDefaultMessage())); attributes.addFlashAttribute("mensagem", "Verifique os campos!"); return "redirect:/cadastrarVaga"; }
检查数据库配置:
确保application.properties/application.yml中的数据库URL、用户名、密码正确,开启spring.jpa.hibernate.ddl-auto=update让Hibernate自动生成表结构。验证Repository配置:
确保VagaRepository继承JpaRepository或CrudRepository,SpringBoot默认会为其添加事务支持,保证save方法正常执行。
内容的提问来源于stack exchange,提问作者SchattenRaff
相关产品推荐
相关产品推荐

