Я создаю 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!