[英]Beans in a multi-module project
我正在一個由SpringBoot驅動的多模塊項目中,該模塊具有core
和web
模塊。 我將自定義驗證器用於電子郵件,密碼等。 驗證器被定義為core
模塊的一部分。 我需要一些自定義的反饋消息,這些消息存儲在message.properties
文件中,這是一個示例定義:
core.model.validator.EmailValidator.email_invalid=Invalid email address
我還具有ValidEmail
界面,該界面看起來如下:
@Target({TYPE, FIELD, ANNOTATION_TYPE})
@Retention(RUNTIME)
@Constraint(validatedBy = UserEmailValidator.class)
@Documented
public @interface ValidEmail {
String message() default "{core.model.validator.EmailValidator.email_invalid}";
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
}
顯然,我應該定義LocalValidatorFactoryBean
的bean,其中應包含一個設置為使用本地消息源的本地驗證器。
這是我的web
模塊中的內容:
@SpringBootConfiguration
public class MvcWebConfig implements WebMvcConfigurer {
// ...skipped...
@Bean
public MessageSource messageSource() {
ReloadableResourceBundleMessageSource messageSource = new ReloadableResourceBundleMessageSource();
messageSource.setBasename("classpath:messages");
messageSource.setDefaultEncoding("UTF-8");
return messageSource;
}
@Bean
public LocalValidatorFactoryBean getValidator() {
LocalValidatorFactoryBean localValidatorFactoryBean = new LocalValidatorFactoryBean();
localValidatorFactoryBean.setValidationMessageSource(messageSource());
return localValidatorFactoryBean;
}
}
(完整版本可在此處獲得 )
工作正常。
但我想將這些bean的定義移至core
模塊。 我在那里有以下課程:
@SpringBootConfiguration
public class AppConfig {
// ...skipped...
}
(完整版本可在此處獲得 )
當我將這兩個bean的定義移至core
模塊(移至AppConfig
類)后,我的驗證錯誤就不再得到解決,我只得到一個消息標簽( {core.model.validator.EmailValidator.email_invalid}
),而不是英語描述( Invalid email address
)。
有人會告訴我我做錯了什么嗎?
在此先感謝您的幫助!
PS這是到完整源代碼的鏈接: https : //github.com/melnik13/pass-pass/tree/d24eebfc48610e924308d2da4cd978ac965e2e4e ,希望對您有所幫助。
在@SpringBootConfiguration
類的javadocs中,據說
應用程序只能包含一個
@SpringBootConfiguration
因此,我首先要檢查是否已加載此核心配置。 用@Configuration
標記核心配置類並在Web配置類中使用@Import
或@ComponentScan
可能是有意義的。
實施了變通辦法。
Bean在core
模塊中定義:
@Configuration
public class CoreModuleConfiguration {
// ...
@Bean(name="coreLocalValidatorFactoryBean")
public LocalValidatorFactoryBean getValidator() {
LocalValidatorFactoryBean localValidatorFactoryBean = new LocalValidatorFactoryBean();
localValidatorFactoryBean.setValidationMessageSource(messageSource());
return localValidatorFactoryBean;
}
}
(完整版本在這里 )
然后在web
模塊中提到了相同的bean:
@Configuration
public class WebModuleConfiguration implements WebMvcConfigurer {
// ...
private final LocalValidatorFactoryBean localValidatorFactoryBean;
@Autowired
public WebModuleConfiguration(
// ...
@Qualifier("coreLocalValidatorFactoryBean") LocalValidatorFactoryBean localValidatorFactoryBean
) {
// ...
this.localValidatorFactoryBean = localValidatorFactoryBean;
}
// ...
@Bean(name = "webLocalValidatorFactoryBean")
public LocalValidatorFactoryBean getValidator() {
return this.localValidatorFactoryBean;
}
}
(完整版本在這里 )
好吧,這有點丑陋,但是可以用。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.