Spring MVC Spring不接受抽象类继承器作为参数

y1aodyip  于 2022-11-14  发布在  Spring
关注(0)|答案(2)|浏览(212)

我在Sping Boot 中创建模型时遇到以下问题。
创建了抽象模型类-

public abstract class AbstractRequest {
    private String tariffType;
}

而他的继承人

public class Request extends AbstractRequest {
   // some fields
}

在控制器中我传递一个抽象请求

@PostMapping
public ResponseEntity<PriceResponse> calculate(@RequestBody AbstractRequest request) {
    return ResponseEntity.ok(calculationService.calculate(request));
}

服务接口也有一个抽象请求类

public interface CalculationService {
    PriceResponse calculate(AbstractRequest request);
}

在服务接口的实现中,我试图接受抽象模型的继承者

@Service
public class CalculationServiceFTL implements CalculationService {
    @Override
    public PriceResponse calculate(Request request) {
    }
}

结果我得到一个错误

Class 'CalculationServiceFTL' must either be declared abstract or implement abstract method 'calculate(AbstractRequest)' in 'CalculationService'

请解释为什么spring不接受抽象类继承者作为参数,如果我可以有几个抽象模型继承者,并且我需要在不同的服务中以不同的方式处理它们,我应该如何处理。谢谢

jdgnovmf

jdgnovmf1#

1.抽象类不能直接示例化,只能由其继承的具体类示例化。
1.任何继承抽象类的具体类都应该是可以用构造函数示例化的(当然如果不是抽象类本身的话),但是Spring禁止使用构造函数,因为我们用这种方法示例化的任何类都不能被Spring的自动依赖注入所控制。

owfi6suc

owfi6suc2#

如果要实现一个接口,则需要使用相同的方法签名来实现该接口中所有未实现的方法。

public interface CalculationService {
    PriceResponse calculate(AbstractRequest request);
}

所以你实现的类也应该有相同的实现方法和相同的签名

@Service
public class CalculationServiceFTL implements CalculationService {
    @Override
    public PriceResponse calculate(AbstractRequest request) {
    }
}

因此,为了解决这个问题,您可以更改接口类或实现的服务类中的参数类型,使它们相同。

相关问题