Quando vou cadastrar Curso Logica de programação esta sendo salvo no banco "Curso Logica de programação", onde corrijo isso?
Quando vou cadastrar Curso Logica de programação esta sendo salvo no banco "Curso Logica de programação", onde corrijo isso?
Oi Giulia,
Vixe, essa questão de charset
, referente aos caracteres especiais, sempre é algo que dá dor de cabeça nos projetos =/
Isso porque tanto o charset da aplicação quanto do banco de dados precisam ser o UTF-8, que reconhece os acentos do português brasileiro.
Faz o seguinte, pode ser que apenas no banco de dados esteja errado, então execute os seguintes comandos no seu mysql:
ALTER DATABASE casadocodigo CHARACTER SET utf8 COLLATE utf8_general_ci;
ALTER TABLE Produto CHARACTER SET utf8 COLLATE utf8_general_ci;
Cadastre um novo produto e veja se aparece normalmente. Obs: os registros já existentes vão continuar com problemas. Apenas os novos serão salvos corretamente.
Rodei o código porém continua salvando com erro.
Oi Giulia,
Altera no seu form.jsp
a tag doctype
, bem no inicio do arquivo, para ficar assim:
<!DOCTYPE html>
E teste novamente um novo cadastro.
Coloquei esse doctype no meu form de cadastro, mesmo assim nao resolveu
Oi Giulia,
Precisamos descobrir se o problema é no Spring ou no MySQL.
Faz o seguinte, vai no método gravar
do ProdutosController
e adiciona um System.out
antes de chamar a dao
:
System.out.println("SALVANDO PRODUTO: " +produto.getTitulo());
dao.gravar(produto);
Cadastre um produto na aplicação e olhe no console do Eclipse se chegou com os acentos certinhos ou já apareceu com problemas.
Se tiver chegado ok, então o problema é no MySQL, caso contrário, o problema é no Spring.
Fiz o teste e esta imprimindo
SALVANDO PRODUTO: Curso Logica de programação
Oi Giulia,
Bom então o problema não é no MySQL.
Parece que o Spring não está fazendo o encoding dos carecteres corretamente.
Isso não deveria acontecer, pois no projeto tem uma configuração para o Spring utilizar o charset UTF-8.
Dá uma conferida no seu projeto na classe ServletSpringMVC, que está no pacote br.com.casadocodigo.loja.conf.
Veja se tem esse método:
@Override
protected Filter[] getServletFilters() {
CharacterEncodingFilter encodingFilter = new CharacterEncodingFilter();
encodingFilter.setEncoding("UTF-8");
return new Filter[] {encodingFilter};
}
O código completo dessa classe:
package br.com.casadocodigo.loja.conf;
import javax.servlet.Filter;
import javax.servlet.MultipartConfigElement;
import javax.servlet.ServletRegistration.Dynamic;
import org.springframework.web.filter.CharacterEncodingFilter;
import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer;
public class ServletSpringMVC extends AbstractAnnotationConfigDispatcherServletInitializer{
@Override
protected Class<?>[] getRootConfigClasses() {
return new Class[] {SecurityConfiguration.class,
AppWebConfiguration.class, JPAConfiguration.class};
}
@Override
protected Class<?>[] getServletConfigClasses() {
return new Class[] {};
}
@Override
protected String[] getServletMappings() {
return new String[] {"/"};
}
@Override
protected Filter[] getServletFilters() {
CharacterEncodingFilter encodingFilter = new CharacterEncodingFilter();
encodingFilter.setEncoding("UTF-8");
return new Filter[] {encodingFilter};
}
//veja tbm https://cursos.alura.com.br/forum/topico-atualizacao-resources-nao-sao-carregados-na-aula-10-58813
@Override
protected void customizeRegistration(Dynamic registration) {
registration.setMultipartConfig(new MultipartConfigElement(""));
}
}
sim minha classe esta conforme mencionado, abaixo
package br.com.casadocodigo.loja.conf;
import javax.servlet.Filter;
import javax.servlet.MultipartConfigElement;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.ServletRegistration.Dynamic;
import org.springframework.orm.jpa.support.OpenEntityManagerInViewFilter;
import org.springframework.web.context.request.RequestContextListener;
import org.springframework.web.filter.CharacterEncodingFilter;
import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer;
public class ServletSpringMVC extends AbstractAnnotationConfigDispatcherServletInitializer{
@Override
protected Class<?>[] getRootConfigClasses() {
return new Class[] {SecurityConfiguration.class,
AppWebConfiguration.class, JPAConfiguration.class};
}
@Override
protected Class<?>[] getServletConfigClasses() {
return new Class[] {};
}
@Override
protected String[] getServletMappings() {
return new String[] {"/"};
}
@Override
protected Filter[] getServletFilters() {
CharacterEncodingFilter encodingFilter = new CharacterEncodingFilter();
encodingFilter.setEncoding("UTF-8");
return new Filter[] {encodingFilter, new OpenEntityManagerInViewFilter()};
}
//veja tbm https://cursos.alura.com.br/forum/topico-atualizacao-resources-nao-sao-carregados-na-aula-10-58813
@Override
protected void customizeRegistration(Dynamic registration) {
registration.setMultipartConfig(new MultipartConfigElement(""));
}
@Override
public void onStartup(ServletContext servletContext) throws ServletException {
super.onStartup(servletContext);
servletContext.addListener(RequestContextListener.class);
servletContext.setInitParameter("spring.profiles.active", "dev");
}
}
Oi Giulia,
Eu baixei o projeto aqui do curso e simulei o problema no meu computador.
Realmente ele acontece :D
Pesquisei e descobri que esse problema acontece por conta do Spring Security. Após você habilitá-lo no projeto, ele meio que "sobrescreve" aquele CharacterEncodingFilter
.
Acredito que tem haver com a ordem de carregamento dos filtros.
Para resolver o problema, basta você setar o CharacterEncodingFilter
na classe SecurityConfiguration, no método configure(HttpSecurity http):
@Override
protected void configure(HttpSecurity http) throws Exception {
CharacterEncodingFilter filter = new CharacterEncodingFilter();
filter.setEncoding("UTF-8");
filter.setForceEncoding(true);
http.addFilterBefore(filter,CsrfFilter.class);
//daqui para baixo continua a configuracao de restricao das urls
}
Com isso você pode remover a configuração antiga da classe ServletSpringMVC, deixando o método assim:
@Override
protected Filter[] getServletFilters() {
return new Filter[] {new OpenEntityManagerInViewFilter()};
}
Agora vai funcionar finalmente.
muito bom agora rodou