Solucionado (ver solução)
Solucionado
(ver solução)
10
respostas

Caracteres especiais

Quando vou cadastrar Curso Logica de programação esta sendo salvo no banco "Curso Logica de programação", onde corrijo isso?

Matricule-se agora e aproveite até 50% OFF

O maior desconto do ano para você evoluir com a maior escola de tecnologia

QUERO APROVEITAR
10 respostas

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");
    }

}
solução!

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