Estou usando a dependência org.modelmapper, para fazer o mapeamento automático de classes entidades para classes Resource e enviar para qualquer aplicação cliente e vice versa, Angular, mobile,stc.
Para classes comuns, ok. Agora para classes que tenha classes dentro dela não estou conseguindo. Já li algumas matérias, mas não sai ainda.
tenho um Util
package br.com.clinicamedica.utilitario;
import java.lang.reflect.Type;
import java.util.List;
import org.modelmapper.ModelMapper;
import org.springframework.stereotype.Component;
@Component("mapperUtil")
public class MapperUtil {
protected ModelMapper modelMapper;
public MapperUtil() {
this.modelMapper = new ModelMapper();
}
public <S, D> D mapTo(S source, Class<D> destClass) {
return this.modelMapper.map(source, destClass);
}
public <S, D> List<D> toList(List<S> source, Type destClass) {
return this.modelMapper.map(source, destClass);
}
}
uma controladora
package br.com.clinicamedica.utilitario;
import java.lang.reflect.Type;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageImpl;
import org.springframework.stereotype.Component;
@Component("appControllerBase")
public class AppControllerBase {
@Autowired
private MapperUtil mapperUtil;
public <S, D> D mapTo(S source, Class<D> dest) {
return mapperUtil.mapTo(source, dest);
}
public <S, D> List<D> toList(List<S> source, Type dest) {
return mapperUtil.toList(source, dest);
}
public <S, D> Page<D> toPage(Page<S> source, Type dest) {
List<D> list = mapperUtil.toList(source.getContent(), dest);
return new PageImpl<>(list, source.getPageable(), source.getTotalElements());
}
}
Para classes assim, funcionam:
package br.com.clinicamedica.core.especialidades;
import static lombok.AccessLevel.PROTECTED;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Index;
import javax.persistence.SequenceGenerator;
import javax.persistence.Table;
import javax.persistence.UniqueConstraint;
import br.com.clinicamedica.core.PrincipalCore;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
@Setter
@Getter
@Builder
@NoArgsConstructor(access = PROTECTED)
@AllArgsConstructor(access = PROTECTED)
@Entity
@Table(name = "TAB_ESPECIALIDADES", uniqueConstraints = {
@UniqueConstraint(columnNames = { "DS_NOME" }, name = "U1_TAB_ESPECIALIDADES") }, indexes = {
@Index(columnList = "DS_NOME", name = "I1_TAB_ESPECIALIDADES") })
public class Especialidades extends PrincipalCore {
private static final long serialVersionUID = -950209194144143065L;
@Id
@Column(name = "PK_ESPECIALIDADES")
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "SQ_ESPECIALIDADES")
@SequenceGenerator(name = "SQ_ESPECIALIDADES", sequenceName = "SQ_ESPECIALIDADES", allocationSize = 1)
private Long id;
@Column(name = "DS_NOME", nullable = false)
private String nome;
}
e
package br.com.clinicamedica.core.especialidades.resource;
import static lombok.AccessLevel.PUBLIC;
import br.com.clinicamedica.utilitario.mensagem.Mensagem;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
@Setter
@Getter
@Builder
@NoArgsConstructor(access = PUBLIC)
@AllArgsConstructor(access = PUBLIC)
public class EspecialidadesResource {
private Long id;
private String nome;
private Mensagem mensagem;
}
Agora para esse tipo não
package br.com.clinicamedica.core.fichasPaciente;
import static lombok.AccessLevel.PROTECTED;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.ForeignKey;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Index;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.SequenceGenerator;
import javax.persistence.Table;
import javax.persistence.UniqueConstraint;
import br.com.clinicamedica.core.PrincipalCore;
import br.com.clinicamedica.core.especialidades.Especialidades;
import br.com.clinicamedica.core.planosdesaude.PlanosDeSaude;
import br.com.clinicamedica.core.paciente.Paciente;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
@Setter
@Getter
@Builder
@NoArgsConstructor(access = PROTECTED)
@AllArgsConstructor(access = PROTECTED)
@Entity
@Table(name = "TAB_FICHAS_PACIENTE", uniqueConstraints = {
@UniqueConstraint(columnNames = { "FK_PLANOS_DE_SAUDE", "FK_ESPECIALIDADES", "FK_PACIENTE" }, name = "U1_TAB_FICHAS_PACIENTE") }, indexes = {
@Index(columnList = "FK_PLANOS_DE_SAUDE", name = "I1_TAB_FICHAS_PACIENTE"),
@Index(columnList = "FK_ESPECIALIDADES", name = "I2_TAB_FICHAS_PACIENTE"),
@Index(columnList = "FK_PACIENTE, name = "I3_TAB_FICHAS_PACIENTE") })
public class FichasPaciente extends PrincipalCore {
private static final long serialVersionUID = -2740363873592617496L;
@Id
@Column(name = "PK_FICHAS_PACIENTE")
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "SQ_FICHAS_PACIENTE")
@SequenceGenerator(name = "SQ_FICHAS_PACIENTE", sequenceName = "SQ_FICHAS_PACIENTE", allocationSize = 1)
private Long id;
@ManyToOne
@JoinColumn(name = "FK_PLANOS_DE_SAUDE", nullable = false, foreignKey = @ForeignKey(name = "FOR_FICHA_PACIENTE"))
private PlanosDeSaude planosDeSaude;
@ManyToOne
@JoinColumn(name = "FK_ESPECIALIDADES", nullable = false, foreignKey = @ForeignKey(name = "FOR_ESPECIALIDADES"))
private Especialidades especialidades;
@ManyToOne
@JoinColumn(name = "FK_PACIENTE", nullable = false, foreignKey = @ForeignKey(name = "FOR_PACIENTE"))
private Paciente paciente;
}
e
package br.com.clinicamedica.core.fichasPaciente.resource;
import static lombok.AccessLevel.PUBLIC;
import br.com.clinicamedica.core.PrincipalResource;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
@Setter
@Getter
@Builder
@NoArgsConstructor(access = PUBLIC)
@AllArgsConstructor(access = PUBLIC)
public class FichasPacienteResource extends PrincipalResource {
private static final long serialVersionUID = 9183941443385578752L;
private Long id;
private String planosDeSaude;
private String especialidades;
private String nomePaciente;
private Long numeroCarteiraPlano;
}
private Collection<FichasPacienteResource> converterLista(Collection<FichasPaciente> lista) {
String msg = "convertendo entidade para resource, a entidade FichasPaciente";
log.debug(INICIO + msg);
Collection<FichasPacienteResource> retorno = new ArrayList<>();
lista.forEach(entity -> {
try {
log.debug("Fazer filtro");
ModelMapper modelMapper = new ModelMapper();
Type type = new TypeToken<List<FichasPacienteResource>>() {
}.getType();
List<FichasPacienteResource> r = appControllerBase.toList(new ArrayList<>(lista), type);
} catch (Exception e) {
log.error(e.getMessage(), e);
}
});
log.debug(FIM + msg);
return retorno;
}
O que pode estar faltando ?