簡體   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