java如果实体有枚举变量,如何从实体到DTO?
我正在创建我所有实体的DTO版本。我对一个只有一个枚举值的实体有问题。这是我的实体:
@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;
}
我之所以追随that tutorial↑ 是因为我想在数据库中写入enum(而不是enum名称本身)的变量值(tipoNombre),因为这是一种格式。我想用重音符号将其存储在DB中,并在Postman或任何带有重音符号的REST客户端应用程序中显示它!不要在前端告诉我任何关于格式化的信息,因为这个项目只是后端:( 好吧,我想你会明白我在这张照片中发现了什么:
如果你知道更好的方法,请告诉我,但这不是我的问题
让我给你看一下枚举:
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.");
}
}
}
问题是,如果我将其转换为DTO版本,就无法在Postman中获得输出。我在没有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 楼答案
我明白了!!!我从没想过这会奏效
我刚刚更改了上面的代码(Dto):
私人蒂波莫夫·蒂波
到
私人Stringtipo
我无法解释如何将实体中的枚举转换为DTO,使用字符串代替枚举。。。但这奏效了
如果你有同样的问题。。。这是我在枚举和字符串之间的属性转换器
仍然需要在enum变量上方的实体类中使用它:
但在DTO中不是必需的。只需在DTO中使用字符串而不是枚举