Erro de Encoding ao enviar formulário para Controller

8 respostas
dsystem

Pessoal, estou desenvolvendo uma aplicação utilizando Spring MVC e estou com problema de encoding quando envio os dados do meu formulário para o meu Controller. Já coloquei o filtro nas configurações do Spring para UFT-8, já alterei as configurações do Eclipse e já verifiquei no meu jsp. Está tudo ok, porém não sei mais o que fazer. Alguém poderia me ajudar? Obrigada

8 Respostas

Dragoon

Tem como você colocar o uma parte do código? para que tenhamos possibilidade de te ajudar?

dsystem

Claro,

Esse é o filter

@Override
	protected Filter[] getServletFilters() {
		CharacterEncodingFilter encodingFilter = new CharacterEncodingFilter();
		encodingFilter.setEncoding("UTF-8");
		encodingFilter.setForceEncoding(true);
		
		return new Filter[]{encodingFilter};
	}

Minha JSP

<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form" %>
<%@ taglib uri="http://www.springframework.org/tags" prefix="s" %>
<!DOCTYPE html>
<html>
<head>

<meta charset="utf-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1" />
<meta name="viewport"
	content="width=device-width, initial-scale=1, maximum-scale=1" />

<c:url value="/" var="contextPath" />
<link href="${contextPath}resources/css/bootstrap.min.css"
	rel="stylesheet" type="text/css" media="all" />
<link href="${contextPath}resources/css/style.css" rel="stylesheet"
	type="text/css" media="all" />
<script type="text/javascript" src="${contextPath}resources/js/jquery-1.12.3.min.js"></script>
<script type="text/javascript" src="${contextPath}resources/js/jquery.maskedinput.min.js"></script>
<script type="text/javascript" src="${contextPath}resources/js/jquery.maskMoney.min.js"></script>
<script type="text/javascript" src="${contextPath}resources/js/bootstrap.min.js"></script>
<script type="text/javascript" src="${contextPath}resources/js/app.js"></script>

</head>
<body>

	<div class="panel panel-default">
		<div class="panel-heading">Cadastro de Compra</div>
		<div class="panel-body">
			<c:if test="${linkGerado != null}">
				<div class="alert alert-info alert-link" role="alert">
					Link gerado para envio ao cliente. <br/><span id="link-gerado">${linkGerado}</span> <br/><button id="cop-link" class="btn btn-info">Copiar link</button>
				</div>
			</c:if>
			<c:if test="${msgRetornoPedido != null}">
				<div class="alert alert-warning alert-link" role="alert">
					${msgRetornoPedido}
				</div>
			</c:if>
			
			<form:form class="form-horizontal" action="${s:mvcUrl('CCC#gravar').build()}" method="POST" commandName="pedido">
				<div class="form-group">
					<label for="nome" class="col-sm-2 control-label">Nome Completo</label>
					<div class="col-sm-10">
						<form:input path="nome" cssClass="form-control" id="nome" placeholder="Nome"/>
					</div>
				</div>
				<div class="form-group">
					<label for="cpf" class="col-sm-2 control-label">CPF</label>
					<div class="col-sm-10">
						<form:input path="cpf" cssClass="form-control" id="cpf" placeholder="CPF"/>
					</div>
				</div>
				<div class="form-group">
					<label for="pedido" class="col-sm-2 control-label">N° do Pedido</label>
					<div class="col-sm-10">
						<form:input path="numero" cssClass="form-control" id="numero" placeholder="Numero do Pedido"/>
					</div>
				</div>
				<div class="form-group">
					<label for="valor" class="col-sm-2 control-label">Valor</label>
					<div class="col-sm-10">
						<form:input path="valor" cssClass="form-control" id="valor" placeholder="Valor"/>
					</div>
				</div>
				<div class="form-group">
					<div class="col-sm-offset-2 col-sm-10">
						<button type="submit" class="btn btn-primary">Enviar</button>
				    </div>
				</div>


			</form:form>

		</div>
	</div>


</body>
</html>

Meu Controller

@RequestMapping("/editar")
	public ModelAndView editar(Parametro parametro){
		parametroDAO.editar(parametro);
		return this.parametro(parametro);
	}
Dragoon

Como está configurado o seu banco de dados? Qual a Collation dele?

dsystem

Está em UTF8 ; o estranho é que se eu passo os dados direto pela URL, ele vem com o encoding correto, porém se eu passo pelo meu form, ele vem errado

Dragoon

Vamos tentar algumas dessas soluções:

Solução 1

No web.xml adicione:

<filter>
    <filter-name>encodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
        <param-name>encoding</param-name>
        <param-value>UTF-8</param-value>
    </init-param>
    <init-param>
        <param-name>forceEncoding</param-name>
        <param-value>true</param-value>
    </init-param>
</filter>

<filter-mapping>
    <filter-name>encodingFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

Solução 2

Use request.setCharacterEncoding("UTF-8"); no seu código:

<%@ page contentType="text/html; charset=UTF-8" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
   <head>
     <title>Character encoding test page</title>
   </head>
   <body>
     <p>Data posted to this form was:
     <%
       request.setCharacterEncoding("UTF-8");
       out.print(request.getParameter("mydata"));
     %>

     </p>
     <form method="POST" action="index.jsp">
       <input type="text" name="mydata">
       <input type="submit" value="Submit" />
       <input type="reset" value="Reset" />
     </form>
   </body>
</html>

Solução 3

No arquivo pom.xml

<properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    ...
</properties>

Solução 4

Tem isso:

<%@ page pageEncoding="UTF-8" contentType="text/html; charset=UTF-8" %>

troque por isso:

<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />

Referente ao link: UTF-8 encoding in Spring MVC, problem with FORMs

Link explicativos:

dsystem

Fiz todos esses passos, não funcionou =/ . Mais alguma dica? rs

Dragoon

bem complicado seu problema. Não sou do mundo Java mas se souber de algo mais posto aqui

J

Depois de muito sofrer resolvi o mesmo problema da seguinte maneira:

Formulario é necessário incluir o acceptCharset

<form:form action="${pageContext.servletContext.contextPath}/cadastro-estabeleciemento-inclusao" method="POST" commandName="estabelecimento" enctype="multipart/form-data" acceptCharset="utf-8">

Já no AbstractSecurityWebApplicationInitializer inclui o seguinte código:

@Override
    protected void beforeSpringSecurityFilterChain(ServletContext servletContext) {
        super.beforeSpringSecurityFilterChain(servletContext);
 
        FilterRegistration.Dynamic characterEncodingFilter;
        characterEncodingFilter = servletContext.addFilter("encodingFilter",
                new CharacterEncodingFilter());
        characterEncodingFilter.setInitParameter("encoding", "UTF-8");
        characterEncodingFilter.setInitParameter("forceEncoding", "true");
        characterEncodingFilter.addMappingForUrlPatterns(null, false, "/*");
    }

E também o tão falado filtro na AbstractAnnotationConfigDispatcherServletInitializer.

@Override 
	protected Filter[] getServletFilters() { 
		CharacterEncodingFilter encodingFilter = new CharacterEncodingFilter();
		encodingFilter.setForceEncoding(true);
		encodingFilter.setEncoding("UTF-8");
		return new Filter[]{encodingFilter};
	}
Criado 3 de junho de 2016
Ultima resposta 9 de ago. de 2016
Respostas 8
Participantes 3