多模块项目中的Bean

时间:2019-02-24 19:56:56

标签: java spring spring-boot

我正在开发一个由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;
    }

}

(完整版本为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,希望对您有所帮助。

2 个答案:

答案 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

嗯,这有点丑陋,但是可以用。