在 Spring 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 不接受抽象類繼承人作為引數,如果我可以有多個抽象模型繼承人并且我需要在不同的服務中以不同方式處理它們,我應該如何處理。謝謝
uj5u.com熱心網友回復:
抽象類不能直接實體化,只能通過其繼承的具體類來實體化。
任何繼承抽象類的具體類都應該可以使用建構式進行實體化(當然,如果不是抽象本身)。但是 Spring 禁止使用建構式,因為我們以這種方式實體化的任何類都不能由 Spring 的自動依賴注入負責。
uj5u.com熱心網友回復:
如果您正在實作一個介面,您需要使用相同的方法簽名從您正在實作的介面中實作所有未實作的方法。
public interface CalculationService {
PriceResponse calculate(AbstractRequest request);
}
所以你實作的類也應該有相同的實作方法和相同的簽名,比如
@Service
public class CalculationServiceFTL implements CalculationService {
@Override
public PriceResponse calculate(AbstractRequest request) {
}
}
因此,為了解決這個問題,您可以更改介面類或實作的服務類中的引數型別,以使它們相同。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/513220.html
