2 回答

TA貢獻1906條經驗 獲得超3個贊
答案很簡單:您不需要任何魔法,它只在 Spring 中起作用。你有你的AppValidator,然后你就做(它是通過查看泛型類型注入的):
@Autowired
private Validator<String> appValidator;
好吧,現在假設你有兩個Validator<String>,然后呢?required a single bean but found two exception- 就是這樣。這就是為什么這是一種可怕的做法,永遠不要這樣做。
在我的工作中,一個人創建了具有 3 個泛型類型的泛型接口,然后基于這些泛型類型進行注入,人們仍然討厭他。它看起來像這樣,是的,只要您在多個實現中沒有以完全相同的順序使用完全相同的 3 個泛型類型,它就可以工作:
@Autowired
private Invoker<String, Integer, Person> personInvoker;
@Autowired
private Invoker<Integer, String, Animal> animalInvoker;
即使您的代碼中沒有多個Validator<String>,并且您不打算擁有更多 - 其他人可能會進來并添加它們,或者在許多其他情況下。

TA貢獻1877條經驗 獲得超6個贊
這里是您的模塊(應用程序和核心)之間的關系:
Application 1 Application 2 Application 3
| | |
Validator<Foo> Validator<Bar> Validator<FooBar>
| | |
| | |
|__ __ __ __ __ __ _| __ __ __ __ __ __ |
|
| <<uses>>
|
\ /
Core Module
|
ValidateController (not generic rest controller)
這里有些不對勁,因為您希望共享組件ValidateController依賴于特定的應用程序泛型Validator類而 ValidateController不是泛型類,因此您只能堅持使用Object該Validator字段的泛型類型。
為了使事情保持一致,您應該創建這個缺失的鏈接。事實上,您需要不同的控制器子類,因為每個控制器都需要使用特定的驗證器實例。
例如,您可以ValidateController在共享/代碼模塊中定義一個抽象類/接口,并讓每個子類擴展它并為自己定義Validator要使用的通用類。
這里是你的模塊之間的目標關系:
Application 1 Application 2 Application 3
| | |
Validator<Foo> Validator<Bar> Validator<FooBar>
FooController(bean) BarController(bean) FooBarController(bean)
| | |
| | |
|__ __ __ __ __ ___ | __ ___ __ __ __ __ __|
|
| <<uses>>
|
\ /
Core Module
|
ValidateController<T> (abstract class and not a bean)
例如在核心/共享模塊中:
public abstract class ValidateController<T> {
private Validator<T> validator;
ValidateController(Validator<T> validator){
this.validator = validator;
}
@RequestMapping("/")
public void index(T t) {
boolean isValid = validator.validate(t);
}
}
在應用程序中,定義您的驗證器實現:
@Component
public class AppValidator implements Validator<String> {
@Override
public boolean validate(String data) {
return ...;
}
}
并定義StringController子類(或@Bean作為替代)以設置正確的Validator:
@RestController
public class StringController extends ValidateController<String>{
public ValidateControllerApp(Validator<String> validator){
this.validator = validator;
}
}
添加回答
舉報