generi c весной 5 - PullRequest
       37

generi c весной 5

0 голосов
/ 12 апреля 2020

весной 5, я хочу использовать Generi c в Autowired. например, думал, что у меня есть класс и в классе есть метод, который преобразует StudentDTO в StudentEntity и наоборот.

@Component
public class Convert<T,U> {

    public <T,U> U convertEntityAndDTO(T t, U u){
        BeanUtils.copyProperties(t,u);
        return u;
    }
}

теперь я хочу внедрить его в класс SudentService и использовать их

public class StudentService {

    @Autowired
    Convert convert;

//I need both of them in class
//convert<Student,StudentDTO> convert
//convert<StudentDTO,Student> convert

    public StudentDTO getStudent(Integer id){

        Student student = studentRepository.getStudent(id);
        Object o = convert.convertEntityAndDTo(student, new StudentDTO());

        return (StudentDTO)o;
    }

я могу использовать downcast, но не могу использовать generi c

 convertEntityAndDTo(student, new StudentDTO());
 convertEntityAndDTo(studentDTO, new Student());

1 Ответ

0 голосов
/ 12 апреля 2020

Я думаю, вы ищете два экземпляра полностью обобщенного класса, верно?

Во-первых, вам нужно два экземпляра вашего компонента, поэтому @Component не будет работать, так как это создает один экземпляр. Вместо этого вам нужен @Configuration аннотированный класс, в котором вы можете определить два @Bean аннотированных метода, возвращающих соответственно обобщенные типы.

Теперь из-за удаления типа вы не можете просто объявить два свойства ожидаемого обобщенного типа. и @Autowired аннотация, так как автоматическое подключение выполняется по типу, поэтому во время выполнения оба компонента имеют одинаковый тип. Вместо этого вы можете автоматически связывать по имени - скажем, один bean-компонент определен в методе с именем fromDtoConverter(), а другой - в методе с именем toDtoConverter(), тогда вместо @Autowired используйте @Resource("fromDtoConverter") и @Resource("toDtoConverter") в своих обобщенных свойствах.

...