Я пытаюсь создать автоконфигурацию, в которой некоторые свойства должны проходить проверку только в определенных случаях. У меня есть служба MyService, для которой требуются учетные данные Properties.username и Properties.password, а также OncePerRequestFilter, который перехватывает вызовы контроллера и вызывает MyService для выполнения некоторых действие, для которого требуется имя приложения Properties.app-name.
Вот глобальный макет:
- < li>когда я не предоставляю ни свойств, ни MyService bean-компонент существует, автоконфигурация ничего не делает.
- если bean-компонент MyService не существует, но я указываю имя пользователя и пароль в свойствах, я создаю новый MyService bean-компонент, и я хочу проверить имя пользователя и пароль.
- если существует bean-компонент MyService, я создам OncePerRequestFilter и хочу проверить название приложения.
Первая попытка
Код
Автоконфигурация
Код: Выделить всё
@AutoConfiguration
@EnableConfigurationProperties(MyProperties.class)
public class MyAutoConfiguration {
@Bean
@ConditionalOnMissingBean
@ConditionalOnProperty(prefix = "properties", name = { "username", "password" })
@Validated(CredentialsRequired.class)
public MyService myDefaultService(@Valid MyProperties properties) {
return new MyService(properties);
}
@Bean
@ConditionalOnBean(MyService.class)
@Validated(AppNameRequired.class)
OncePerRequestFilter myFilter(@Valid MyProperties properties, MyService myService) {
return new MyFilter(properties, myService);
}
}
Код: Выделить всё
@Data
@ConfigurationProperties("properties")
public class MyProperties {
@NotBlank(groups = AppNameRequired.class)
private String appName;
@NotBlank(groups = CredentialsRequired.class)
private String username;
@NotBlank(groups = CredentialsRequired.class)
private String password;
}
Когда я не предоставляю никаких свойств, ничего не выходит из строя, что и желательно. Однако, если я просто использую следующие свойства:
Код: Выделить всё
properties.username=
properties.password=
Код: Выделить всё
@Bean
@ConditionalOnBean(MyService.class)
@Validated(AppNameRequired.class)
OncePerRequestFilter myFilter(@Valid MyProperties properties, MyService myService, Validator validator) {
if(!validator.validate(properties, AppNameRequired.class).isEmpty()) {
throw new IllegalArgumentException(); // Should not be reached if validation works, but is thrown on instantiation
}
return new MyFilter(properties, myService);
}
Я также пробовал применить @Validated для MyProperties , но это мало что изменило. Более того, я заметил это в более глобальном случае:
- когда в классе есть @Validated и все ограничения без групп действительны, ошибка не выдается, даже если некоторые ограничения с группами недействительны.
- когда в классе есть @Validated, но хотя бы одно ограничение без группы нарушено, Spring не выполняет проверку создание экземпляра
когда есть @Validated(AppNameRequired.class) в классе, и все ограничения без групп действительны, ошибок не возникает, даже если ограничения с группой AppNameRequired недействительны
После всего этого я пришел к выводу, что Spring не поддерживает группы проверки для проверка bean-компонента. Следовательно, мне интересно: есть ли способ выполнить эту условную проверку, полагаясь только на аннотации Jakarta и Spring Boot, или мне придется вручную вызывать валидатор для выполнения этого?
Подробнее здесь: https://stackoverflow.com/questions/792 ... ired-beans
Мобильная версия