当前位置: 首页 > 知识库问答 >
问题:

是否可以在自定义Spring Boot启动器中设置默认application.yml?

单于翰飞
2023-03-14

我的自定义spring boot starter和作为依赖项使用的spring boot应用程序消费者面临一个问题。我在两份申请中都有。yml但似乎我正在寻找的配置只有在消费者中定义时才有效。

我在starter中的配置如下:

@Getter
@Setter
@Configuration
@ConfigurationProperties(prefix = "security")
public class StarterSecurityConfig {
    private boolean jwtEnabled;
    private String[] unsecuredPaths;
    private String[] securedPaths;
}

我在自动配置类中定义了这个bean:

@Bean
public StarterSecurityConfig starterSecurityConfig() {
    return new StarterSecurityConfig();
}

拥有此应用程序的使用者可以完美地检索到它。yml和其他变量:

    security:
  jwt-enabled: true
  secured-paths:
    - /user/**
  unsecured-paths:
    - /**

但如果我将其从消费者中删除并放入应用程序中。启动程序bean在创建它们时没有这些属性。

也许我错过了什么?

共有2个答案

穆轶
2023-03-14

您可以尝试在启动器本身上初始化成员变量。如果消费者想要覆盖他们可以用他们的应用程序配置来实现的值。

@Getter
@Setter
@Configuration
@ConfigurationProperties(prefix = "security")
public class StarterSecurityConfig {
    private boolean jwtEnabled = true;
    private String[] unsecuredPaths = { "/user/**" };
    private String[] securedPaths = { "/**" };
}

Fews更多想法:

我将使jwtEnable为false,并从上面的类中删除@Configuration和@ConfigurationProperties,并使用其他bean创建一个SecurityAutoConfiguration类。

@Configuration
public class SecurityAutoConfiguration{

   @Bean
   @ConfigurationProperties(prefix = "security")
   public StarterSecurityConfig starterSecurityConfig(){
     return new StarterSecurityConfig();
   }

   @Bean
   @ConditionalOnProperty(value="security.jwtEnabled", havingValue = "true")
   public JwtService jwtService(StarterSecurityConfig starterSecurityConfig) {
     return new JwtService(starterSecurityConfig);
   }   

}

消费者将能够使用启用标志使用其应用程序配置启用或禁用security.jwt安全启动器。

钱修雅
2023-03-14

如果我正确理解了你的问题,就在上周我遇到了这样的问题...我正在检查这个问题,我有一些发现(官方留档不支持它们):如果你添加了依赖项并想使用它的资源,你有一个情况,当两个application.yml文件具有相同的位置-classpath:application.yml,并且或者它们不能一起加载,或者其中一个被另一个覆盖。无论如何,在我的应用程序中,它不起作用。

如果您只需要从依赖配置文件加载配置,那么这是一个简单明了的解决方案—重命名它并以可能的方式加载(从YAML、属性源的初始值设定项等手动加载)

但是,如果这个配置文件应该在任何地方使用,我们可以在上下文中手动加载属性。在依赖项(在您的情况下是消费者)中创建另一个配置文件,例如,@配置类中的consumer-application.yml和下一个bean:

@Bean
public static PropertySourcesPlaceholderConfigurer properties() {
    var propertySourcesPlaceholderConfigurer = new PropertySourcesPlaceholderConfigurer();
    var yamlPropertiesFactoryBean = new YamlPropertiesFactoryBean();
    yamlPropertiesFactoryBean.setResources(new ClassPathResource("consumer-application.yaml"));
    propertySourcesPlaceholderConfigurer.setProperties(yamlPropertiesFactoryBean.getObject());
    return propertySourcesPlaceholderConfigurer;
}

您可以使用@Value在两个应用程序中使用YAML文件中的属性。

但最简单的方法是使用属性配置。在这种情况下,您只需在consumer和PropertySource(value={“classpath:application.properties”,“classpath:consumer application.properties”)中设置PropertySource(“classpath:consumer application.properties”),在我的情况下,这两个变体都可以正常工作。

 类似资料:
  • 问题内容: 我有一些需要经常打印的结构。现在,我正在围绕该结构使用经典的打印包装器: 此功能很方便,但实际上也很有限。如果不进行新包装,则无法添加或添加一些文本。我知道我可以使用 va_arg 系列添加或添加一些文本,但是我觉得我会重新实现。 我想知道是否有可能向printf编写自定义函数。我希望能够写这样的东西: 这可能吗 ?我怎样才能做到这一点 ? 注意:我在Ubuntu Linux 10.0

  • 所以,我一直在读C++标准,找到了[defns.Undefined](3.27,在我正在读的C++17草案中,请注意,当我在这里引用C++17时,我在其他标准中发现了类似的措辞)--这是未定义行为的定义。我注意到这样的措辞(强调我的): 注意:当本国际标准省略任何行为的明确定义时,或者当程序使用错误的构造或错误的数据时,可能会出现未定义的行为 现在,想想看,这有点道理。这有点像是说,如果标准没有给

  • 问题内容: 更新时间 : 输出: 当我们添加时,需要一些信息来设置默认排序整数值,但是如果我将字符串添加到设置,则默认情况下不会排序。 更新: 并且Caps字母将在运行多次后始终进行排序。 java版本“ 1.6.0_26” Java™SE运行时环境(内部版本1.6.0_26-b03)Java HotSpot™客户端VM(内部版本20.1-b02,混合模式,共享) 请给我一些想法。谢谢 问题答案:

  • 我很好奇是否可以将iOS设置(例如位置/图片)重置为默认设置,这样用户每次都会被问到是否允许位置或相机使用。 目前,我正在尝试用Ionic/Cordova做这件事。 也许你们中有人知道怎么做,或者能告诉我这是不是可能的。

  • 之前我用的是实时DB,现在需要改用fiRecovery 当我在实时数据库中写入数据时,我使用了这种方法。 所以数据会这样显示 但是当我使用消防商店时,它将显示这一点 我能否将< code > u 93 aclsjjilqbdfck 2 ST 更改为< code > 02 nfe 2 jzidgzxzwypmcwq 20 qwq 93 ,如果可以更改,我该怎么做? 这是我的代码。

  • 问题内容: 我知道如何通过执行以下操作来为名称已经知道的属性创建getter和setter: 现在,我的问题是,是否可以定义像这样的所有获取方法和设置方法?即,创建getter和setter的任何属性名称 是不是 已经定义。 这个概念可以在PHP中使用和魔术方法(有关这些信息,请参见PHP文档),因此我真的在问是否存在与这些方法等效的JavaScript? 不用说,理想情况下,我想要一个跨浏览器兼