繁体   English   中英

多模块项目中的Bean

[英]Beans in a multi-module project

我正在一个由SpringBoot驱动的多模块项目中,该模块具有coreweb模块。 我将自定义验证器用于电子邮件,密码等。 验证器被定义为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 ,希望对您有所帮助。

@SpringBootConfigurationjavadocs中,据说

应用程序只能包含一个@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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM