是否可以在我的自定义自动配置库中使用自动配置Bean?

问题描述 投票:0回答:1

我利用 Spring JavaMailSender 并实现了一个自定义 MailService,它使用 Thymeleaf 和 Spring JavaMailSender 来提供高级服务方法。这个效果很好。

现在我需要在另一个应用程序中提供相同的功能。因此,我将该服务提取到一个库中,并使用自动配置将其连接到我的应用程序中。

库和应用程序均使用 Spring 版本 3.3.2 和 Java 17。

在我的 POM 库中,我有这些依赖项:

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-autoconfigure-processor</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-mail</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-thymeleaf</artifactId>
        </dependency>

我的应用程序取决于我的图书馆:

        <dependency>
            <groupId>com.acme.library</groupId>
            <artifactId>lib-spring-mail</artifactId>
            <version>1.0.0-SNAPSHOT</version>
        </dependency>

@AutoConfiguration 注解的类如下所示:

@AutoConfiguration(after = { MailSenderAutoConfiguration.class,
                             ThymeleafAutoConfiguration.class})
@ConditionalOnClass({JavaMailSender.class, TemplateEngine.class})
public class MailAutoConfiguration {

    @Autowired
    private JavaMailSender mailSender;

    @Autowired
    private TemplateEngine templateEngine;

    @Bean
    @ConditionalOnMissingBean
    public MailService mailService() {
        return new MailService(mailSender, templatingService());
    }

    @Bean
    @ConditionalOnMissingBean
    public TemplatingService templatingService() {
        return new TemplatingService(templateEngine);
    }
}

并且 org.springframework.boot.autoconfigure.AutoConfiguration.imports 文件如下所示:

org.springframework.boot.autoconfigure.mail.MailSenderAutoConfiguration

虽然编译没有问题,但启动应用程序时我收到此错误消息:

Field mailSender in com.acme.library.spring.mail.MailAutoConfiguration required a bean of type 'org.springframework.mail.javamail.JavaMailSender' that could not be found.

The injection point has the following annotations:
    - @org.springframework.beans.factory.annotation.Autowired(required=true)

Action:

Consider defining a bean of type 'org.springframework.mail.javamail.JavaMailSender' in your configuration.

底层异常是:

Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'org.springframework.mail.javamail.JavaMailSender' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.raiseNoMatchingBeanFound(DefaultListableBeanFactory.java:1880) ~[spring-beans-6.1.11.jar:6.1.11]
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1406) ~[spring-beans-6.1.11.jar:6.1.11]
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1353) ~[spring-beans-6.1.11.jar:6.1.11]
    at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.resolveFieldValue(AutowiredAnnotationBeanPostProcessor.java:784) ~[spring-beans-6.1.11.jar:6.1.11]

虽然我的应用程序应该将这两个启动器依赖项作为我的库 POM 的传递依赖项找到,但我明确地将它们添加到应用程序的 POM 中。然而,这并没有改变错误

如何在我的库中使用 Spring-Boot 预配置的 JavaMailSender?这可能吗?

java spring-boot spring-autoconfiguration
1个回答
0
投票

您需要在

org.springframework.boot.autoconfigure.AutoConfiguration.imports
文件夹中创建
META-INF/spring
文件。

在里面您需要列出您的配置 FQN。每行一个。

© www.soinside.com 2019 - 2024. All rights reserved.