[英]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.