Skip to content

gilluan/selma-test

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

17 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Selma Framework

Objetivo

Clonar, mapear e transformar objetos de forma automática como se fosse escritos manualmente. Exemplo.: Conversão de Entity para DTO e vice-versa.

Características

  • Mapeamento checado em tempo de compilação
  • Não usa reflections
  • Usa somente anotação para configuração do código
  • Baseado na JSR 269
  • Fácil aprendizado
  • Suporta mapeamentos customizados a nível de atributos

Uso

Declarando um simples mapeamento

	public class Pessoa {
	    	private String nome;
	    	private String sobrenome;
	    	// + Getters and Setters
	}
	public class PessoaDTO {
	    	private String nome;
	    	private String sobrenome;
	    	// + Getters and Setters
	}	
	
	@Mapper
	public interface PessoaMapper {
		Pessoa toEntity(PessoaDTO dto);
		PessoaDTO toDTO(Pessoa pessoa);
	}

	PessoaMapper pessoaMapper = Selma.builder(PessoaMapper.class).build();
	PessoaDTO dto = pessoaMapper.toDTO(in);
	Pessoa entity = pessoaMapper.toEntity(in);

Clone de um objeto

	@Mapper
	public interface PessoaMapper {
		// somente informando que o retorno é o mesmo que o parâmetro
		Pessoa clonePessoa(Pessoa in);
	}

	Pessoa dto = pessoaMapper.clonePessoa(in);

Mapeamento com atributos diferentes

	public class Carro {
	    private String marca;
	    private String nomeComercial;
	    // + Getters and Setters
	}
	
	public class CarroDTO {
	    private String marca;
	    private String modelo;
	    // + Getters and Setters
	}
	
	@Mapper(withCustomFields = {
        	@Field({"modelo", "nomeComercial"})
    	})
	public abstract class CarroMapper {
	    // + assinaturas necessárias    
	}

Mapeamento Ignorando campos que só existem em um lado

	@Builder
	public class Carro {
	    private String marca;
	    private String nomeComercial;
	    private Integer ano;
	    private String placa;
	    // + Getters and Setters
	}
	
	@Builder
	public class CarroDTO {
	    private String marca;
	    private String modelo;
	}
	
	@Mapper(withIgnoreFields = {"ano", "placa"})
	public abstract class CarroMapper {
	    // + assinaturas necessárias    
	}

Mapeando para objetos planos

	public class Endereco {
	    private String logradouro;
	    private String bairro;
	    private String cep;
	    private String numero;
	    private String complemento;
    	}

	
	public class Fornecedor {
	    private Integer id;
	    private String nome;
	    private String cnpj;
	    private Endereco endereco;
        // + Getters and Setters
    	}
	
	public class FornecedorDTO {
	    private Integer id;
	    private String nome;
	    private String cnpj;
	    private String logradouro;
	    private String bairro;
	    private String cep;
	    private String numero;
        // + Getters and Setters
    	}
    
	@Mapper(withCustomFields = {
	        @Field({"endereco.logradouro", "logradouro"}),
	        @Field({"endereco.bairro", "bairro"}),
	        @Field({"endereco.cep", "cep"}),
	        @Field({"endereco.numero", "numero"})
	})
	public interface FornecedorMapper {
		    // + assinaturas necessárias    	
	}

Mapeando para listas

	@Mapper(
		// + customizacoes quando necessárias
	)
	public interface FornecedorMapper {
		Fornecedor toEntity(FornecedorDTO dto);
		List<Fornecedor> toListEntity(List<FornecedorDTO> dto);
	}

Mapeamento com vários mappers

	@Mapper( 
		withIgnoreFields = {"endereco", "matricula", "nascimento"},
		withCustom = {
			FornecedorMapper.class, 
			ClienteMapper.class, 
			TelefoneMapper.class
		}
	)
	public interface PedidoMapper extends MapperBase<Pedido, PedidoDTO> {
		    // + assinaturas necessárias    	
	}

Implementando conversor manualmente

	@Mapper
	public abstract class CarroMapper {

	    public Carro toEntity(CarroDTO dto) {
	    	return new Carro(dto.getMarca(), dto.getModelo());
	    };
	}

Evitar desabilitar checkagem de forma automática

	// ignora todas a propriedades divergentes
	@Mapper(withIgnoreMissing = IgnoreMissing.ALL)

	// ignora as propriedades que não existem no objeto de entrada
	@Mapper(withIgnoreMissing = IgnoreMissing.SOURCE)

	// ignora as propriedades que não existem no objeto de saída
    	@Map(withIgnoreMissing = IgnoreMissing.DESTINATION)

Código fonte exemplos

Github - Gilluan

Github - Selma

Comparação entre outros frameworks de mapeamentos

Resultados

Testes executados em:

  • OS: macOS Seria
  • CPU: 3.1 GHz Intel Core i7, 2 cores, L2 Cache (per Core): 256 KB, L3 Cache: 4 MB
  • RAM: 16 GB 1867 MHz DDR3
  • JVM: Oracle 1.8.0_74-b02 64 bits
BenchmarkModeSamplesScoreMargin error (+/-)Units
Manualthrpt20016 262 69074 221ops/s
Selmathrpt20015 773 71799 740ops/s
MapStructthrpt20014 518 416179 884ops/s
JMapperthrpt20014 492 38182 798ops/s
Orikathrpt2003 550 46430 533ops/s
ModelMaperthrpt200256 9592 413ops/s
Dozerthrpt20086 607488ops/s

Legenda: Quanto maior o score melhor

Total tempo: 00:48:33

Referências:

https://github.com/arey/java-object-mapper-benchmark

http://www.selma-java.org/

About

test-selma

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages