我有一個這樣定義的服務類,
@RequiredArgsConstructor
class SomeService<T extends AbstractResponse> {
private final ValidationService<T> validationService;
....
}
我有兩種AbstractResponse,ResponseA并且ResponseB為它們定義了一個驗證服務。
@Service("aValidationService");
class AValidationService<ResponseA> implements ValidationService<ResponseA> {
....
}
和
@Service("ValidationService");
class BValidationService<ResponseB> implements ValidationService<ResponseB> {
....
}
現在 spring 正在拋出一個錯誤,因為它無法推斷ValidationService要使用的實作,因為它SomeService有兩個實作。如何讓spring根據AbstractResponse的型別推斷出正確的實作?
uj5u.com熱心網友回復:
希望我能理解您的要求。
當您有(2)同類時,您不能自動注入。在這種情況下驗證服務。
您可以注入@ValidationServiceA, 或@ValidationServiceB, 或 aList<ValidationServiceI>然后根據<T> type您關心的 a 回傳您想要的:
下面的解決方案強調了這一點。
該方法getGenericParameter()用于回傳<T>引數。這是為了避免使用反射。
methodWhichDeterminesWhichServiceToUseBasedOnResponseType用于根據您需要的輸入確定要使用哪個 ValidationService的方法。
您可以在下面找到完整的解決方案,包括驗證測驗。
import org.springframework.stereotype.Service;
@Service
public class ValidationServiceA implements ValidationServiceI<ResponseA>{
@Override public Class<ResponseA> getGenericParameter() {
return ResponseA.class;
}
public void print(){
System.out.println("Service A");
}
}
@Service
public class ValidationServiceB implements ValidationServiceI<ResponseB>{
@Override public Class<ResponseB> getGenericParameter() {
return ResponseB.class;
}
public void print(){
System.out.println("Service B");
}
}
public interface ValidationServiceI<T>{
Class<T> getGenericParameter();
void print();
}
@Service
public class ServiceWhichCallsOthers {
@Autowired
private List<ValidationServiceI> validationServices;
public <T> ValidationServiceI<T> methodWhichDeterminesWhichServiceToUseBasedOnResponseType(T responseType){
Optional<ValidationServiceI> validationServiceSupportingResponse = validationServices.stream().filter(validationServiceI -> validationServiceI.getGenericParameter().equals(responseType)).findFirst();
return validationServiceSupportingResponse.get();
}
public void callValidationServiceA(){
methodWhichDeterminesWhichServiceToUseBasedOnResponseType(ResponseA.class).print();
}
public void callValidationServiceB(){
methodWhichDeterminesWhichServiceToUseBasedOnResponseType(ResponseB.class).print();
}
}
@SpringBootTest
public class ServiceWhichCallsOthersIT {
@Autowired
private ServiceWhichCallsOthers serviceWhichCallsOthers;
@Test
public void validateBasedOnResponseType(){
Assertions.assertEquals(ValidationServiceA.class, serviceWhichCallsOthers.methodWhichDeterminesWhichServiceToUseBasedOnResponseType(ResponseA.class).getClass());
Assertions.assertEquals(ValidationServiceB.class, serviceWhichCallsOthers.methodWhichDeterminesWhichServiceToUseBasedOnResponseType(ResponseB.class).getClass());
serviceWhichCallsOthers.callValidationServiceA();
serviceWhichCallsOthers.callValidationServiceB();
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/485564.html
