为了账号安全,请及时绑定邮箱和手机立即绑定

多模块项目中的 Bean

多模块项目中的 Bean

白衣非少年 2022-07-06 17:28:38
我正在开发一个由 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)@Documentedpublic @interface ValidEmail {    String message() default "{core.model.validator.EmailValidator.email_invalid}";    Class<?>[] groups() default {};    Class<? extends Payload>[] payload() default {};}显然,我应该定义一个 bean,LocalValidatorFactoryBean它应该包含一个本地验证器,设置为使用本地消息源。这是我的web模块中的内容:@SpringBootConfigurationpublic 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模块中。我在那里有以下课程:@SpringBootConfigurationpublic class AppConfig {    // ...skipped...}(完整版可在此处获得)一旦我将这两个 bean 的定义移动到core模块(到AppConfig类)中,我的验证错误就不再得到解决,我只得到一个消息标签({core.model.validator.EmailValidator.email_invalid})而不是英文描述(Invalid email address)。有人会这么好心告诉我我做错了什么吗?提前感谢您的帮助!PS这是完整源代码的链接:https ://github.com/melnik13/pass-pass/tree/d24eebfc48610e924308d2da4cd978ac965e2e4e ,希望对您有所帮助。
查看完整描述

2 回答

?
慕村9548890

TA贡献1884条经验 获得超4个赞

实施了解决方法。


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;

    }


}


好吧,它有点难看,但它确实有效。


查看完整回答
反对 回复 2022-07-06
?
眼眸繁星

TA贡献1873条经验 获得超9个赞

javadocs to @SpringBootConfigurationclass中,据说

应用程序应该只包括一个@SpringBootConfiguration

所以首先我会检查这个核心配置是否已经加载。@Configuration使用@Import@ComponentScan在 web 配置类中标记核心配置类可能是有意义的。


查看完整回答
反对 回复 2022-07-06
  • 2 回答
  • 0 关注
  • 121 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号