Как от Entity к DTO, если Entity имеет переменную Enum? - PullRequest
1 голос
/ 04 августа 2020

Я создаю DTO-версии всех своих сущностей. У меня проблема с сущностью, имеющей одно значение Enum. Это моя сущность:

@Getter
@Setter
@Table(name = "TIPOS_MOVIMIENTO")
@Entity

public class TipoMovimiento {

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private int id;

@Column
@Convert(converter = TipoMovEnumConverter.class)
private TipoMov tipo;

public String getTipo() {
    return tipo.getTipoNombre();
}

@OneToMany(mappedBy = "tipoMov")
private List<Movimiento> movimientos;

Нет, у меня нет @Enumerated, потому что я следовал руководству: «Конвертер атрибутов JPA 2.1 - лучший способ сохранить перечисления», и мне пришлось удалить его. Как видите, я использую конвертер.

Это мой DTO предыдущей сущности:

@Getter
public class TipoMovimientoDto implements DtoEntity {


@Convert(converter = TipoMovEnumConverter.class) //I don't even know if write this here!!!!!
private TipoMov tipo;
}

Причина, по которой я следовал этому руководству ↑ потому что я хотел записать в базу данных значения переменных (tipoNombre) перечисления (не само имя перечисления), потому что формат. Я хочу сохранить его в БД с акцентами, и я хочу показать его в Postman или другом клиентском приложении REST с акцентами! Не говорите мне ничего о форматировании во внешнем интерфейсе, потому что этот проект является только внутренним :( Ну, я думаю, вы поймете, что я нашел с этим, с изображением:

Что я ищу

Если вы знаете лучший способ сделать это, дайте мне знать, но сейчас это не моя проблема.

Позвольте мне показать вам Enum:

public enum TipoMov {

INGRESO("Ingreso"),
PRESTAMO("Prestamo"),
PAGO("Pago"),
AMORTIZACION("Amortización"),
INTERES("Interés");

private String tipoNombre;


public String getTipoNombre() {
    return tipoNombre;
}


TipoMov(String tipoNombre) {
    this.tipoNombre = tipoNombre;
}


public static TipoMov fromDBName(String tipoNombre) {
    switch (tipoNombre) {
    case "Ingreso":
        return TipoMov.INGRESO;

    case "Préstamo":
         return TipoMov.PRESTAMO;

    case "Pago":
         return TipoMov.PAGO;

    case "Amortización":
         return TipoMov.AMORTIZACION;
         
    case "Interés":
     return TipoMov.INTERES;

    default:
        throw new IllegalArgumentException("ShortName [" + tipoNombre
                + "] not supported.");
    }
}




}

Проблема в том, что я не могу получить результат в Postman, если конвертирую его в версию DTO. Я получаю соответствующий результат без DTO. Я использую службы REST. Позвольте мне показать вам службы и контроллер. (Они включают обе версии, без DTO и с DTO (который не работает)).

ServiceImpl

@Service
public class TipoMovimientoServiceImpl implements TipoMovimientoService {

@Autowired
TipoMovimientoRepository repository;

@Autowired
DtoUtils dtoUtils;


public List<DtoEntity> findAllDto() {

    List<TipoMovimiento> tiposMovimiento = repository.findAll();
    List<DtoEntity> tiposMovimientoDto = new ArrayList();
    
    for (TipoMovimiento tipoMovimiento : tiposMovimiento) {
    
        DtoEntity tipoMovimientoDto= dtoUtils.convertToDto(tipoMovimiento, new TipoMovimientoDto());
        tiposMovimientoDto.add(tipoMovimientoDto);
    }

    return tiposMovimientoDto;
    
}

public List<TipoMovimiento> findAll() {

    List<TipoMovimiento> tiposMovimiento = repository.findAll();

    return tiposMovimiento;
    
}


}

Сервисный интерфейс

public interface TipoMovimientoService {


List<DtoEntity> findAllDto();
List<TipoMovimiento> findAll();


}

Контроллер:

@RestController
public class PruebasController {


@Autowired
TipoMovimientoService service;

@GetMapping("tiposmovdto")  
public ResponseEntity <List <DtoEntity> > findAllDto() {
    return ResponseEntity.ok(service.findAllDto());
}

@GetMapping("tiposmov") 
public ResponseEntity <List <TipoMovimiento> > findAll() {
    return ResponseEntity.ok(service.findAll());
}

}

Как я уже сказал, версия nonDto работает отлично, а вот версии DTO нет. Это не вина преобразователя DTO, потому что у меня есть другие службы REST (у которых нет перечислений), отлично работающие с DTO. Это проблема совместимости Enum и Dto!

1 Ответ

0 голосов
/ 04 августа 2020

Я понял !!! Я никогда не думал, что это сработает. private String tipo;

Я не могу объяснить, как Enum from Entity можно было преобразовать в DTO, используя String вместо Enum ... Но это сработало!

In если у вас такая же проблема ... это мой конвертер атрибутов между Enum и String

@Converter(autoApply = true)
public class TipoMovEnumConverter implements AttributeConverter<TipoMov, String> { 

public String convertToDatabaseColumn(TipoMov tipoMov) {
    return tipoMov.getTipoNombre();
}

    public TipoMov convertToEntityAttribute(String dbData) {
        return  dbData == null ? null : TipoMov.fromDBName(dbData);
    }
    
}

Все еще необходимо использовать его в классе Entity, выше переменной enum:

@Convert(converter = TipoMovEnumConverter.class)

Но не обязательно в DTO. Просто используйте String вместо Enum в DTO!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...