我正在开发一个由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;
}
}
(完整版本为here)
它工作正常。
但是我想将这些bean的定义移到core
模块中。我在那里有以下课程:
@SpringBootConfiguration
public class AppConfig {
// ...skipped...
}
(完整版本为here)
当我将这两个bean的定义移至core
模块(移至AppConfig
类)后,我的验证错误就不再得到解决,我仅收到一条消息标签({core.model.validator.EmailValidator.email_invalid}
),而不是英文说明(Invalid email address
)。
有人会友好地告诉我我在做什么错吗?
在此先感谢您的帮助!
P.S。这是完整资源的链接:https://github.com/melnik13/pass-pass/tree/d24eebfc48610e924308d2da4cd978ac965e2e4e,希望对您有所帮助。
答案 0 :(得分:0)
在javadocs to @SpringBootConfiguration
class中,据说
应用程序只能包含一个
@SpringBootConfiguration
所以我首先要检查是否已加载此核心配置。可能更有意义的是用@Configuration
标记核心配置类,并在Web配置类中使用@Import
或@ComponentScan
。
答案 1 :(得分:0)
实施了解决方法。
bean在core
模块中定义:
@Configuration
public class CoreModuleConfiguration {
// ...
@Bean(name="coreLocalValidatorFactoryBean")
public LocalValidatorFactoryBean getValidator() {
LocalValidatorFactoryBean localValidatorFactoryBean = new LocalValidatorFactoryBean();
localValidatorFactoryBean.setValidationMessageSource(messageSource());
return localValidatorFactoryBean;
}
}
(完整版本为here)
然后在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;
}
}
(完整版本为here)
嗯,这有点丑陋,但是可以用。