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

Conversão da Entity para um DTO

Extrapolando o assunto abordado na aula em que o professor nos apresenta uma forma de converter o resultado que é um List< post> para um List< postDTO>, apresento a seguinte realidade abaixo:

A JPQL criada no repository:

@Query(value="select p" +
            " from Permissao p JOIN p.perfisPermissoes pp where pp.idPerfil =:idPerfil and p.stBloqueio='N'")
    public List<Permissao> listarPermissoesByPerfil(@Param("idPerfil") Long idPerfil);

O DTO para eu utilizar no meu controller

@Getter
@Setter
@NoArgsConstructor
@Builder
public class PermissaoDTO {

    private Long idPermissao;
    private String nmPermisaso;
    private String dsPermissao;
    private String nmLink;
    private String pathLink;
    private String stBloqueio;
    private Long idModulo;

    public PermissaoDTO(Permissao permissao) {
        this.idPermissao = permissao.getIdPermissao();
        this.nmPermisaso = permissao.getNmPermissao();
        this.dsPermissao = permissao.getDsPermissao();
        this.nmLink = permissao.getNmLink();
        this.pathLink = permissao.getPathLink();
        this.stBloqueio = permissao.getStBloqueio();
        this.idModulo = permissao.getIdModulo();
    }

    public Long getIdPermissao() {
        return idPermissao;
    }

    public String getNmPermisaso() {
        return nmPermisaso;
    }

    public String getDsPermissao() {
        return dsPermissao;
    }

    public String getNmLink() {
        return nmLink;
    }

    public String getPathLink() {
        return pathLink;
    }

    public String getStBloqueio(){
        return stBloqueio;
    }

    public Long getIdModulo() {
        return idModulo;
    }

    public static List<PermissaoDTO> converter(List<Permissao> permissao) {
        return permissao.stream().map(PermissaoDTO::new).collect(Collectors.toList());
    }
}

Meu service que se encarrega de converter o resultado que é uma entidade para o DTO (usando o método converter)

public List<PermissaoDTO> getPermissoesByIdPerfil(Long idPerfil){

        List<Permissao> permissoes = permissaoRepository.listarPermissoesByPerfil(idPerfil);

    return PermissaoDTO.converter(permissoes);

Bem. Meu problema é: Estou tomando um erro na hora de compilar que diz:

Error:(14, 1) java: no suitable constructor found for PermissaoDTO(java.lang.Long,java.lang.String,java.lang.String,java.lang.String,java.lang.String,java.lang.String,java.lang.Long)
    constructor br.mil.fab.controledeacesso.domains.permissao.PermissaoDTO.PermissaoDTO(br.mil.fab.controledeacesso.domains.permissao.Permissao) is not applicable
      (actual and formal argument lists differ in length)
    constructor br.mil.fab.controledeacesso.domains.permissao.PermissaoDTO.PermissaoDTO() is not applicable
      (actual and formal argument lists differ in length)

Aguardo vcs. Valeu!

3 respostas

Pelo o que entendi do erro na hora de passar um List permissao como parâmetro para o método converter ele compara com o construtor do PermissaoDTO e percebe que são quantidade diferentes de argumentos. Conferi na aula e vi que isso não foi problema para o professor. Uma vez que DTO nao precisa ter os mesmos campos da Entity.

Oi Paulo,

Realmente não era para dar problema, pois sua classe DTO tem o construtor que recebe como parâmetro o objeto Permissao, mas o Java está buscando um construtor que recebe os dados do objeto permissão separados.

Consegue compartilhar seu projeto?

solução!

Rodrigo. Fiz um teste aqui. Estou usando uma notação @Builder do Lambok. Ai um construtor já é criado "por debaixo dos panos" recebendo como argumento todas as variaveis declaradas no DTO. No nosso caso, nós estamos criando um contrutor recebendo um objeto como argumento. No caso da aula seria o Post post, no caso do meu exemplo é Permissao permissao. Ai na hora de converter a Entity para DTO dá ruim por conta disso. Retirei o @Builder e funcionou de boas. Mas o @Builder me parece uma mão na roda, principalmente para facilitar a criação de objetos para teste. Enfim ... tenho que ver um jeito de usar o @Builder junto com esse contrutor. De qualquer forma, problema solucionado ... se vc tiver algo a acrescentar ... se não .. pode dar como solucionada esse post. Valeu!