英文:
Apply @EnableJms conditionally in Springboot
问题
给定以下 Spring/Boot 应用程序。
@SpringBootApplication
@Configuration
@ComponentScan
@EnableGlobalMethodSecurity(
prePostEnabled = true,
securedEnabled = false,
jsr250Enabled = false)
@EnableJms // 我们希望能够通过应用程序属性控制此功能的开关
public class PayZilchCustomerServiceApplication {
static {
SSLUtilities.trustAllHostnames();
SSLUtilities.trustAllHttpsCertificates();
}
public static void main(String[] args) {
SpringApplication.run(PayZilchCustomerServiceApplication.class, args);
}
}
我们发现在某些本地调试场景中,我们希望关闭 `@EnableJms`。我们注释掉了这行代码。我们偶尔会创建带有已注释代码的 PR。这些 PR 会在代码审查中被发现。
总有一天会有遗漏。我们希望能够通过应用程序属性文件来控制 `@EnableJms`,最好是默认开启,但可以通过 `application-local.properties` 条目将其关闭。
英文:
Given the following spring/boot application.
@SpringBootApplication
@Configuration
@ComponentScan
@EnableGlobalMethodSecurity(
prePostEnabled = true,
securedEnabled = false,
jsr250Enabled = false)
@EnableJms // we would like to control this from an application property on/off
public class PayZilchCustomerServiceApplication {
static {
SSLUtilities.trustAllHostnames();
SSLUtilities.trustAllHttpsCertificates();
}
public static void main(String[] args) {
SpringApplication.run(PayZilchCustomerServiceApplication.class, args);
}
}
We are finding that for some local debugging scenarios we want @EnableJms
turned off. We comment out the line of code. We are occasionally creating PR(s) with the line commented. The PR are being caught by code review.
It's going to slip through one day. How we control @EnableJms
from an application property file, preferably that it's on by default, but can be turned off with an application-local.properties
entry.
答案1
得分: 5
创建一个新的类,并使用以下三个注解进行标记:
@Configuration
@EnableJms
@ConditionalOnProperty(name = "turnonjms", havingValue = "true")
public class MyEnableJmsCustomConfig {
//你可以保持它为空。只要确保这个类
//与主类在同一个文件夹中
}
你将会从外部来源传递 turnonjms
属性,比如运行时参数 --turnonjms=true
或者 -Dturnonjms
。只有当它存在时,@EnableJms
才会生效。否则它将会关闭。
或者,如果你喜欢的话,你可以始终启用 JMS,并且只在某个外部属性存在时关闭它:
@ConditionalOnProperty(name = "turoffjms", havingValue = "false")
如果你不从外部来源传递 turnoffjms
属性,那么你将始终启用 JMS。如果你传递 --turnoffjms=true
,JMS 将会被禁用。
另外一点,当你使用 @SpringBootApplication
时,它已经包含了 @Configuration
和 @ComponentScan
注解。如果你要扫描当前包以外的文件夹,你会想使用 @ComponentScan
。EnableGlobalMethodSecurity(...)
也已经包含了 @Configuration
,所以你可以从你的主类中安全地移除这两个注解。
编辑:
由于你已经在 application-local.properties
中使用了,插入以下条目来关闭它:
turnoffjms: true # 如果不起作用,将 `true` 放在双引号中
英文:
Create a new class and mark it with these 3 annotation:
@Configuration
@EnableJms
@ConditionalOnProperty(name = "turnonjms", havingValue = "true")
public class MyEnableJmsCustomConfig {
//you can keep it empty. Just make sure this class
//is present in the same folder where main class is
}
You will pass turnonjms
property from external sources like runtime args --turnonjms=true
or -Dturnonjms
. If it is present, only then @EnableJms
will be active. Otherwise it will be off.
Or if you like, you can always have JMS enabled and turn it off only when certain external property is present:
@ConditionalOnProperty(name = "turoffjms", havingValue = "false")
If you don't pass turnoffjms
property from external sources, then you will always have JMS enabled. If you pass --turnoffjms=true
, JMS will be disabled.
On a side note, When you use @SpringBootApplication
, it already has @configuration
and @ComponentScan
annotations within it. You would want to use @ComponentScan
if you were to scan folders outside of current package. EnableGlobalMethodSecurity(...)
also has embedded @Configuration
, so it is safe to remove these two annotation from your main class.
Edit:
Since you are already using application-local.properties, insert this entry to turn it off:
turnoffjms: true
# put true
in double quotes if it doesn't work
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论