[RESOLVIDO] Erro: Thymeleaf está desabilitando a responsividade do meu formulário Bootstrap. Como resolver?

Estou criando uma pequena aplicação web para aprender mais sobre Spring Boot. Estou usando o Thymeleaf como engine HTML e o Bootstrap como framework front-end. O problema é que eu não sei o porquê, e não sei como resolver, ele está desabilitando a responsividade do meu formulário. Ele deveria ficar da largura do container, mas

Ele está assim:

inserir a descrição da imagem aqui

Observação: Estou usando CDN Bootstrap ao invés de arquivos locais.

Alguém pode me ajudar? Desde já muito, obrigada!

Seguem os códigos:

Observação: Projeto completo no GitHub.

Arquivo layout.html:

<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org" 
	xmlns:layout="http://www.ultraq.net.nz/thymeleaf/layout">
	<head>
		<meta charset="UTF-8">
	    <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
	    <link rel="stylesheet" th:href="@{css/custom.css}">
		<link rel="stylesheet" th:href="@{https://stackpath.bootstrapcdn.com/bootstrap/4.1.3/css/bootstrap.min.css}" integrity="sha384-MCw98/SFnGE8fJT3GXwEOngsV7Zt27NXFoaoApmYm81iuXoPkFOJwJ8ERdknLPMO" crossorigin="anonymous">
		<title>Amigos leitores</title>
	</head>
		<body>
		<header>
			<nav class="navbar navbar-expand-lg navbar-dark bg-dark">
			  <a class="navbar-brand" th:href="@{/}">
			  	<img th:src="@{/img/TheLibraryFriends.png}" src="../static/img/TheLibraryFriends.png" />
			  </a>
			  <button class="navbar-toggler" type="button" data-toggle="collapse" data-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 active">
			        <a class="nav-link" th:href="@{/}">Home <span class="sr-only">(current)</span></a>
			      </li>
			      <li class="nav-item">
			        <a class="nav-link" th:href="@{sobrenos}">Sobre nós</a>
			      </li>
			      <li class="nav-item">
			        <a class="nav-link" th:href="@{regras}">Regras</a>
			      </li>
			      <li class="nav-item">
			        <a class="nav-link disabled" th:href="@{novoContato}">Entre em Contato!</a>
			      </li>
			    </ul>
			  </div>
			</nav>	
		</header>
		<br />
		
		<div class="container">
			<br />
			<h1 layout:fragment="header">Cabeçalho falso</h1>
			<div layout:fragment="content">Conteúdo falso</div>
		</div>
		<script th:src="@{https://code.jquery.com/jquery-3.3.1.slim.min.js}" integrity="sha384-q8i/X+965DzO0rT7abK41JStQIAqVgRVzpbzo5smXKp4YfRvH+8abtTE1Pi6jizo" crossorigin="anonymous"></script>
		<script th:src="@{https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.3/umd/popper.min.js}" integrity="sha384-ZMP7rVo3mIykV+2+9J3UJ46jBk0WLaUAdn689aCwoqbBJiSnjAK/l8WvCWPIPm49" crossorigin="anonymous"></script>
		<script th:src="@{https://stackpath.bootstrapcdn.com/bootstrap/4.1.3/js/bootstrap.min.js}" integrity="sha384-ChfqqxuZUCnJSK3+MXmPNIyE6ZbWh2IMqE241rYiqJxyMiZ6OW/JmZQ5stwEULTy" crossorigin="anonymous"></script>
	</body>
</html>

Arquivo formContato.html:

<!DOCTYPE html>

<html xmlns:th="http://www.thymeleaf.org" 
	xmlns:layout="http://www.ultraq.net.nz/thymeleaf/layout" layout:decorate="~{Layout}">
	<head>
		<meta charset="UTF-8" />
	</head>
	<body>
	<h1 layout:fragment="header">Fale conosco!</h1>
	<div layout:fragment="content">Dúvidas, críticas e sugestões. Esse é o lugar!
	<br />
	<br />
	<form id="contato" th:action="@{/(formContato)}" th:object="${contato}" action="#" method="post">
		<div th:if="${#fields.hasErrors('*')}" class="alert alert-error">
			<p th:each="error : ${#fields.errors('*')}" th:text="${error}">Erro de validação</p>
		</div>
		<input type="hidden" th:field="*{id}" th:class="${#fields.hasErrors('id')} ? 'field-error'" />
	  <div class="form-group">
	    <label for="nome">Nome:*</label>
	    <input type="text" class="form-control" id="nome" placeholder="Digite seu nome..." th:field="*{nome}" th:class="${#fields.hasErrors('nome')} ? 'field-error'" />
	  </div>
	  <div class="form-group">
	    <label for="email">E-mail:*</label>
	    <input type="text" class="form-control" id="email" placeholder="Digite seu e-mail..."  th:field="*{email}" th:class="${#fields.hasErrors('email')} ? 'field-error'" />
	  </div>
	  <div class="form-group">
	    <label for="assunto">Assunto:*</label>
	    <input type="text" class="form-control" id="assunto" placeholder="Dê um breve título a sua mensagem..." th:field="*{assunto}" th:class="${#fields.hasErrors('assunto')} ? 'field-error'" />
	  </div>
	  <div class="form-group">
	        <label for="mensagem">Mensagem:*</label>
    		<textarea class="form-control" id="mensagem" rows="3" placeholder="Mensagem..." th:field="*{mensagem}" th:class="${#fields.hasErrors('mensagem')} ? 'field-error'" >
    		</textarea>
	  </div>
	  <div class="form-group float-right">
	  		<a th:href="@{/}" href="index.html"><input type="button" class="btn btn-dark" value="Voltar" /></a>
	  		<input type="reset" class="btn btn-dark" value="Limpar" />
	  		<input type="submit" class="btn btn-dark" value="Enviar" />
	  </div>
	</form>
	</div>

	</body>
</html>

Arquivo custom.css:

body{
	background-color: #fafafa !important;
}

Pra reproduzirem o problema o ideal seria postar o código real que o navegador recebe, o resultado pro front-end (navegador).

1 curtida

Ok! :blush:

Esse é o código renderizado pelo navegador da página formContato.html:

<!DOCTYPE html>

<html>
	<head>
		<title>Amigos leitores</title>
		<meta charset="UTF-8">
	    <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
	    <link rel="stylesheet" href="css/custom.css">
		<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.1.3/css/bootstrap.min.css" integrity="sha384-MCw98/SFnGE8fJT3GXwEOngsV7Zt27NXFoaoApmYm81iuXoPkFOJwJ8ERdknLPMO" crossorigin="anonymous">
	<meta charset="UTF-8" />
	</head>
		<body>
		<header>
			<nav class="navbar navbar-expand-lg navbar-dark bg-dark">
			  <a class="navbar-brand" href="/">
			  	<img src="/img/TheLibraryFriends-df55af2ae0ee2d793121e28c7817be9b.png" />
			  </a>
			  <button class="navbar-toggler" type="button" data-toggle="collapse" data-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 active">
			        <a class="nav-link" href="/">Home <span class="sr-only">(current)</span></a>
			      </li>
			      <li class="nav-item">
			        <a class="nav-link" href="sobrenos">Sobre nós</a>
			      </li>
			      <li class="nav-item">
			        <a class="nav-link" href="regras">Regras</a>
			      </li>
			      <li class="nav-item">
			        <a class="nav-link disabled" href="novoContato">Entre em Contato!</a>
			      </li>
			    </ul>
			  </div>
			</nav>	
		</header>
		<br />
		
		<div class="container">
			<br />
			<h1>Fale conosco!</h1>
			<div>Dúvidas, críticas e sugestões. Esse é o lugar!
	<br />
	<br />
	<form id="contato" action="/?formContato" method="post">
		
		<input type="hidden" id="id" name="id" value="" />
	  <div class="form-group">
	    <label for="nome">Nome:*</label>
	    <input type="text" id="nome" placeholder="Digite seu nome..." name="nome" value="" />
	    <small id="ajudaNome" class="form-text text-muted">
			Nome deve ter entre 2 e 50 caracteres.
		</small>
	  </div>
	  <div class="form-group">
	    <label for="email">E-mail:*</label>
	    <input type="text" id="email" placeholder="Digite seu e-mail..." name="email" value="" />
	  	<small id="ajudaEmail" class="form-text text-muted">
			Exemplo: meunome@provedor.com.br
		</small>
	  </div>
	  <div class="form-group">
	    <label for="assunto">Assunto:*</label>
	    <input type="text" id="assunto" placeholder="Dê um breve título a sua mensagem..." name="assunto" value="" />
	  	<small id="ajudaAssunto" class="form-text text-muted">
			O Assunto deve ter entre 2 e 50 caracteres.
		</small>
	  </div>
	  <div class="form-group">
        <label for="mensagem">Mensagem:*</label>
   		<textarea id="mensagem" rows="3" placeholder="Mensagem..." name="mensagem" ></textarea>
   		<small id="ajudaMensagem" class="form-text text-muted">
			A mensagem deve ter entre 2 e 500 caracteres.
		</small>
	  </div>
	  <div class="form-group float-right">
	  		<a href="/"><input type="button" class="btn btn-dark" value="Voltar" /></a>
	  		<input type="reset" class="btn btn-dark" value="Limpar" />
	  		<input type="submit" class="btn btn-dark" value="Enviar" />
	  		
	  </div>
	</form>
	</div>
		</div>
		<script src="https://code.jquery.com/jquery-3.3.1.slim.min.js" integrity="sha384-q8i/X+965DzO0rT7abK41JStQIAqVgRVzpbzo5smXKp4YfRvH+8abtTE1Pi6jizo" crossorigin="anonymous"></script>
		<script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.3/umd/popper.min.js" integrity="sha384-ZMP7rVo3mIykV+2+9J3UJ46jBk0WLaUAdn689aCwoqbBJiSnjAK/l8WvCWPIPm49" crossorigin="anonymous"></script>
		<script src="https://stackpath.bootstrapcdn.com/bootstrap/4.1.3/js/bootstrap.min.js" integrity="sha384-ChfqqxuZUCnJSK3+MXmPNIyE6ZbWh2IMqE241rYiqJxyMiZ6OW/JmZQ5stwEULTy" crossorigin="anonymous"></script>
	</body>
</html>

Falta a class=“form-control” nos seus inputs.

1 curtida

Na página que te enviei, agora que você falou, eu percebi…
Mas fui conferir minha página usando Thymeleaf e ele presente após os ids:

Está presente no código a ser processado pelo Java mas no browser nao chega com essa classe?

1 curtida

Parece que o problema está aqui: th:class
Use th:classappend

1 curtida

Deu certo! Muito obrigada! :blush:

1 curtida