我在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不接受抽象类继承者作为参数,如果我可以有几个抽象模型继承者,并且我需要在不同的服务中以不同的方式处理它们,我应该如何处理。谢谢
2条答案
按热度按时间jdgnovmf1#
1.抽象类不能直接示例化,只能由其继承的具体类示例化。
1.任何继承抽象类的具体类都应该是可以用构造函数示例化的(当然如果不是抽象类本身的话),但是Spring禁止使用构造函数,因为我们用这种方法示例化的任何类都不能被Spring的自动依赖注入所控制。
owfi6suc2#
如果要实现一个接口,则需要使用相同的方法签名来实现该接口中所有未实现的方法。
所以你实现的类也应该有相同的实现方法和相同的签名
因此,为了解决这个问题,您可以更改接口类或实现的服务类中的参数类型,使它们相同。