有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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客户端应用程序中显示它!不要在前端告诉我任何关于格式化的信息,因为这个项目只是后端:( 好吧,我想你会明白我在这张照片中发现了什么:

What I'm looking for

如果你知道更好的方法,请告诉我,但这不是我的问题

让我给你看一下枚举:

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) 个答案

  1. # 1 楼答案

    我明白了!!!我从没想过这会奏效

    @Getter
    public class TipoMovimientoDto implements DtoEntity {
    
    private TipoMov tipo;
    
    }
    

    我刚刚更改了上面的代码(Dto):

    私人蒂波莫夫·蒂波

    私人Stringtipo

    我无法解释如何将实体中的枚举转换为DTO,使用字符串代替枚举。。。但这奏效了

    如果你有同样的问题。。。这是我在枚举和字符串之间的属性转换器

    @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);
        }
        
    }
    

    仍然需要在enum变量上方的实体类中使用它:

    @Convert(converter = TipoMovEnumConverter.class)
    

    但在DTO中不是必需的。只需在DTO中使用字符串而不是枚举