You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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相关请求,避免打印警告。

针对职位无法存入数据库

  1. 检查Vaga实体类:

    • 确保实体类字段与表单name属性完全一致,比如nome、data、salario、descricao对应实体类同名属性;
    • 日期字段用LocalDate类型,SpringBoot默认支持yyyy-MM-dd格式绑定;
    • 金额字段建议用BigDecimal避免浮点精度问题;
    • 添加必要的JPA注解:@Entity、@Table,主键字段添加@Id、@GeneratedValue。
  2. 完善表单提交配置:
    在form标签中明确提交路径,确保请求正确映射到POST接口:

<form method="post" th:action="@{/cadastrarVaga}">
  1. 调试参数绑定错误:
    在POST接口中打印BindingResult的具体错误信息,定位参数绑定失败原因:
if (result.hasErrors()) {
    result.getAllErrors().forEach(error -> System.out.println(error.getDefaultMessage()));
    attributes.addFlashAttribute("mensagem", "Verifique os campos!");
    return "redirect:/cadastrarVaga";
}
  1. 检查数据库配置:
    确保application.properties/application.yml中的数据库URL、用户名、密码正确,开启spring.jpa.hibernate.ddl-auto=update让Hibernate自动生成表结构。

  2. 验证Repository配置:
    确保VagaRepository继承JpaRepository或CrudRepository,SpringBoot默认会为其添加事务支持,保证save方法正常执行。

内容的提问来源于stack exchange,提问作者SchattenRaff

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 00:54:54