所以我有一个应用程序可以在几个不同的国家启动,例如: mvn clean package -Dcountry=法国 分别 mvn clean package -Dcountry=德国
对于不同的国家,我有不同的行为,尤其是在验证内容时。
所以我有一个包含国家依赖 validator 的类:
@Component
public class SomeValidatingClass {
private final Validator myCountrySpecificValidator;
@Autowired
public SomeValidatingClass(MyCountrySpecificValidator myCountrySpecificValidator) {
this.myCountrySpecificValidator = myCountrySpecificValidator;
}
public void doValidate(Object target, Errors errors) {
myCountrySpecificValidator.validate(target, errors);
}
}
第一个依赖于国家/地区的 validator :
public class MyCountrySpecificValidator1 implements Validator {
@Override
public void validate(Object target, Errors errors) {
if (target == null) {
errors.rejectValue("field", "some error code");
}
}
}
第二个依赖于国家/地区的 validator : 让我们假设
public class MyCountrySpecificValidator2 implements Validator {
@Override
public void validate(Object target, Errors errors) {
if (target != null) {
errors.rejectValue("field", "some other error code");
}
}
}
我的问题是
- 当应用程序以 "-Dcountry=FRANCE" 启动时,我如何设法将 MyCountrySpecificValidator1 的实例注入(inject)到 SomeValidatingClass 中
和相应的
- 当应用程序以 "-Dcountry=GERMANY" 启动时,我如何设法将 MyCountrySpecificValidator2 的实例注入(inject)到 SomeValidatingClass 中
最佳答案
您可以使用 @Conditional
注释来根据条件提供实现。像这样
@Bean(name="emailerService")
@Conditional(WindowsCondition.class)
public EmailService windowsEmailerService(){
return new WindowsEmailService();
}
@Bean(name="emailerService")
@Conditional(LinuxCondition.class)
public EmailService linuxEmailerService(){
return new LinuxEmailService();
}
例如
public class LinuxCondition implements Condition{
@Override
public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
return context.getEnvironment().getProperty("os.name").contains("Linux"); }
}
你可以使用任何你需要的属性
或
如果需要多个 bean,请使用 @Profile
注释定义 Activity 配置文件
阅读here
更新:
更简单
@ConditionalOnProperty(name = "country", havingValue = "GERMANY", matchIfMissing = true) and annotate a method which return the germany validator. And the same for France.
关于java - 根据提供的环境属性注入(inject)不同的 bean,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44157476/