【问题标题】:Spring-Boot Generic Constructor Injection CustomSpring-Boot 通用构造函数注入自定义
【发布时间】:2022-01-21 06:00:51
【问题描述】:
public abstract class BaseController<E,DTO> {

    protected final BaseService<E,DTO> service;

   public BaseController(final BaseService<E,DTO> service) {
       this.service = service;
   }
   // code ....
}


public class CarController extends BaseController<Car, CarDto> {

   public CarController(final CarService service) {
      super(service);
   }
   // code ...
}

@Service
public class CarService extends BaseService<Car, CarDto> {

   // code .... 
   //custom method
   public String getName(){
      return "Car Sevice";
  }
}

Spring-boot 通用方法开发。在构造函数中创建的服务。正常工作没有问题。问题是自定义的服务方法。因为服务扩展了 BaseService 并查看所有基本服务方法,但是它是作为 CarService 的自定义服务。 Intellij 报错

service.getname();

我该如何解决这个问题

【问题讨论】:

    标签: spring spring-boot rest dependency-injection service


    【解决方案1】:

    您的服务是 BaseService 的类型,而不是 CarService。

    当您编写 BaseService service = new CarService() 之类的内容时,您无法访问 CarService 的方法,因为您的变量是 BaseService 类型。

    您需要将服务类型更改为通用类型,就像您对实体和 dto 所做的那样。

    public abstract class BaseController<E,DTO, S extends BaseService> {
    
        protected final  S  service;
    
        public BaseController(S service) {
            this.service = service;
        }
        // code ....
    }
    
    
    public class CarController extends BaseController<Car, CarDto, CarService> {
    
         public CarController(final CarService service) {
            super(service);
            service.getName();
        }
        // code ...
    }
    

    BaseController 中的extends BaseService 仅当您想在 BaseController 中使用 BaseService 的任何方法时才需要,例如:

    public abstract class BaseController<E,DTO, S extends BaseService> {
    
        protected final  S  service;
    
        public BaseController(S service) {
            this.service = service;
            service.doSomething();
            service.overrideMe();
        }
        // code ....
    }
    
    public class CarController extends BaseController<Car, CarDto, CarService> {
    
        public CarController(final CarService service) {
            super(service);
            service.getName();
            service.overrideMe();
            service.doSomething();
        }
        // code ...
    }
    
    public abstract class BaseService<E, DTO> {
        public abstract void overrideMe();
        
        public void doSomething() {
            System.out.println("hi");
        }
    }
    
    @Service
    public class CarService extends BaseService<Car, CarDto> {
    
        // code ....
        //custom method
        public String getName(){
            return "Car Sevice";
        }
    
        @Override
        public void overrideMe() {
            System.out.println("Overrided");
        }
    }
    

    如果您的 BaseController 不需要知道 S 正在扩展 BaseService(您不会在 BaseController 中调用 BaseService 的任何方法),您可以删除 extends BaseService 部分

    public abstract class BaseController<E,DTO, S> {
    
        protected final S service;
    
        public BaseController(S service) {
            this.service = service;
        }
        // code ....
    }
    
    
    public class CarController extends BaseController<Car, CarDto, CarService> {
    
        public CarController(final CarService service) {
            super(service);
            service.getName();
            service.overrideMe();
            service.doSomething();
        }
        // code ...
    }
    
    public abstract class BaseService<E, DTO> {
        public abstract void overrideMe();
    
        public void doSomething() {
            System.out.println("hi");
        }
    }
    
    public class CarService extends BaseService<Car, CarDto> {
    
        // code ....
        //custom method
        public String getName(){
            return "Car Sevice";
        }
    
        @Override
        public void overrideMe() {
            System.out.println("Overrided");
        }
    }
    

    还要考虑 BaseController 中是否需要 E 和 DTO

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-12-02
      • 1970-01-01
      • 2021-04-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多