DEV Community

Edivan Carvalho
Edivan Carvalho

Posted on

Debug de Objetos com ToStringBuilder e Logger

Documentação: Debug de Objetos com ToStringBuilder e Logger

Autor: Edivan Carvalho

Data de Criação: 06 de janeiro de 2025

Versão: 1.0

Resumo: Este documento fornece instruções detalhadas sobre como utilizar ToStringBuilder com Logger para debug profissional de objetos Java, seguindo as melhores práticas recomendadas pelo SonarQube.

Palavras-chave: Java, Debug, ToStringBuilder, Logger, SLF4J, Apache Commons Lang, SonarQube, Reflexão


Histórico de Revisões

Data Versão Autor Descrição
06/01/2025 1.0 Edivan Carvalho Criação inicial do documento.

1. Introdução

Durante o processo de debug de aplicações Java, frequentemente precisamos visualizar o conteúdo completo de objetos para identificar problemas. Este documento apresenta a forma profissional e recomendada pelo SonarQube para realizar essa tarefa.


2. Problema

Abordagem Incorreta (não recomendada pelo SonarQube)

System.out.println(objeto);  // Evitar
System.out.println("ID: " + objeto.getId());  // Evitar
Enter fullscreen mode Exit fullscreen mode

Problemas identificados:

  • Não segue padrão de logging profissional
  • Não permite controle de níveis (INFO, DEBUG, ERROR)
  • Dificulta filtragem de logs em produção
  • SonarQube reporta violação de qualidade de código

3. Solução

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.apache.commons.lang3.builder.ToStringBuilder;
import org.apache.commons.lang3.builder.ToStringStyle;

public class NfeMB extends BaseCrudManagedBean {

    private static final Logger logger = LoggerFactory.getLogger(NfeMB.class);

    public void emitirNotaFiscal(Long idNotaFiscal) {
        logger.info("Dados da Nota Fiscal:");
        logger.info(ToStringBuilder.reflectionToString(
            this.notaFiscal, 
            ToStringStyle.MULTI_LINE_STYLE
        ));
    }
}
Enter fullscreen mode Exit fullscreen mode

4. Por que usar ToStringBuilder

4.1 Impressão Automática

Sem ToStringBuilder:

logger.info("ID: " + notaFiscal.getId());
logger.info("Total: " + notaFiscal.getTotalNfe());
// ... muitas linhas
Enter fullscreen mode Exit fullscreen mode

Com ToStringBuilder:

logger.info(ToStringBuilder.reflectionToString(notaFiscal, ToStringStyle.MULTI_LINE_STYLE));
Enter fullscreen mode Exit fullscreen mode

Vantagem: Imprime TODOS os atributos automaticamente usando reflexão Java.


5. Dependências Necessárias

Maven (pom.xml)

<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-lang3</artifactId>
    <version>3.12.0</version>
</dependency>

<dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>slf4j-api</artifactId>
    <version>1.7.36</version>
</dependency>
Enter fullscreen mode Exit fullscreen mode

6. Estilos de Formatação

MULTI_LINE_STYLE (Recomendado)

ToStringStyle.MULTI_LINE_STYLE
Enter fullscreen mode Exit fullscreen mode

Resultado:

NotaFiscal[
  id=165
  totalNfe=125.00
]
Enter fullscreen mode Exit fullscreen mode

DEFAULT_STYLE

ToStringStyle.DEFAULT_STYLE
Enter fullscreen mode Exit fullscreen mode

Resultado: NotaFiscal[id=165,totalNfe=125.00]


7. Níveis de Log

logger.trace("Detalhes muito específicos");
logger.debug("Informações de debug");
logger.info("Informações gerais");           // Use para debug
logger.warn("Avisos");
logger.error("Erros", exception);
Enter fullscreen mode Exit fullscreen mode

8. Como Funciona a Reflexão

ToStringBuilder.reflectionToString(objeto, estilo)
Enter fullscreen mode Exit fullscreen mode

Processo:

  1. Usa Java Reflection para acessar a classe
  2. Obtém todos os atributos (incluindo privados)
  3. Lê o valor de cada atributo
  4. Formata conforme o estilo
  5. Retorna String formatada

9. Comparação de Abordagens

Característica System.out logger.info + ToStringBuilder
Profissional X OK
Controle de nível X OK
Impressão automática X OK
SonarQube aprova X OK

10. Boas Práticas

Fazer

private static final Logger logger = LoggerFactory.getLogger(MinhaClasse.class);

logger.info(ToStringBuilder.reflectionToString(objeto, ToStringStyle.MULTI_LINE_STYLE));

if (objeto != null) {
    logger.info(ToStringBuilder.reflectionToString(objeto, ToStringStyle.MULTI_LINE_STYLE));
}
Enter fullscreen mode Exit fullscreen mode

Não Fazer

System.out.println(objeto);  // X

logger.info("ID: " + objeto.getId());  // X Concatenação

private Logger logger = LoggerFactory.getLogger(getClass());  // X Não estático
Enter fullscreen mode Exit fullscreen mode

11. Exemplo Completo

package com.syndata.web.controller;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.apache.commons.lang3.builder.ToStringBuilder;
import org.apache.commons.lang3.builder.ToStringStyle;

public class NfeMB extends BaseCrudManagedBean {

    private static final Logger logger = LoggerFactory.getLogger(NfeMB.class);

    public void emitirNotaFiscal(Long idNotaFiscal) {

        logger.info("====================================");
        logger.info("=== DEBUG NOTA FISCAL ===");
        logger.info("====================================");

        if (this.notaFiscal == null) {
            logger.warn("Nota Fiscal é NULL!");
        } else {
            logger.info("Dados completos:");
            logger.info(ToStringBuilder.reflectionToString(
                this.notaFiscal, 
                ToStringStyle.MULTI_LINE_STYLE
            ));
        }

        logger.info("====================================");

        try {
            // ... código de emissão
            logger.info("Nota fiscal emitida com sucesso");
        } catch (NegocioException e) {
            logger.error("Erro ao emitir nota fiscal", e);
        }
    }
}
Enter fullscreen mode Exit fullscreen mode

12. Conclusão

ToStringBuilder.reflectionToString() com logger.info() é a forma profissional de debug de objetos Java, aprovada pelo SonarQube.

Benefícios:

  • Impressão automática de TODOS os atributos
  • Formatação legível
  • Controle profissional de logs
  • Fácil manutenção

Documento criado por: Edivan Carvalho

Última atualização: 06 de janeiro de 2025

Top comments (0)