我有一个基于Java配置的spring-boot微服务。现在有一个身份验证令牌容器,我需要调用它来获取访问令牌。该身份验证令牌库有一个这样的类。请注意,类AuthServletContextListener
来自第三方jar
文件,我无法修改。
public class AuthServletContextListener implements ServletContextListener {
public void contextInitialized(ServletContextEvent arg0) {
try {
ServletContext e = arg0.getServletContext();
Properties config = new Properties();
this.addProp(config, e, "auth.token.url", "Token Service URL");
this.addProp(config, e, "auth.system.username", "System Username");
this.addProp(config, e, "cauth.system.password", "System Password");
TokenContainer.init(config);
} catch (IOException arg3) {
arg3.printStackTrace();
}
}
private void addProp(Properties config, ServletContext context, String propName, String descrip) {
String propVal = (String) context.getAttribute(propName);
if (StringUtils.isEmpty(propVal)) {
propVal = context.getInitParameter(propName);
}
if (StringUtils.isNotEmpty(propVal)) {
config.put(propName, propVal);
} else {
throw new RuntimeException("error: ");
}
}
}
AuthContextListener有一个注释,可以自动查找应用程序启动事件。如果包含上述上下文参数,则会自动启动容器正确设置。然后我可以通过这个容器抓取令牌:
TokenContainer.getSystemToken()
如果上面的上下文参数包含在web.xml中,这将成功初始化:
<context-param>
<param-name>auth.system.username</param-name>
<param-value>UserName</param-value>
</context-param>
可以通过使用以下信息创建Spring bean来执行与上面相同的Application上下文配置:
<bean>
<property name="attributes">
<map>
<entry key="auth.token.url" value="${auth.token.url}"/>
<entry key="auth.system.username" value="${auth.system.username}"/>
<entry key="auth.system.password" value="${auth.system.password}"/>
</map>
</property>
</bean>
我的问题是如何在最新的Spring启动应用程序中使用基于Java的配置来实现相同的功能。我所拥有的是application.yml
文件,其中包含auth端点,用户名和密码值。我尝试使用@Configuration
bean,但没有运气。如何在应用程序上下文中设置这三个道具,并使该侦听器自动启动。
答案 0 :(得分:1)
在您的application.yml或application.properties中为您的auth url添加一个集合:
#Example for application.properties
auth.token.url = http:\\...
然后在配置类中配置占位符,以便您可以读取属性值:
@Configuration
public class Config {
@Bean
public PropertySourcesPlaceholderConfigurer propertySourcesPlaceholderConfigurer() {
PropertySourcesPlaceholderConfigurer propertySourcesPlaceholderConfigurer = new PropertySourcesPlaceholderConfigurer();
propertySourcesPlaceholderConfigurer.setLocations(new ClassPathResource("application.properties"));//or application.yml
return propertySourcesPlaceholderConfigurer;
}
}
然后在您的AuthServletContextListener类中:添加此
public class AuthServletContextListener implements ServletContextListener {
@Value("${auth.token.url}")
private String authUrl ;
public void contextInitialized(ServletContextEvent arg0) {
try {
ServletContext e = arg0.getServletContext();
Properties config = new Properties();
this.addProp(config, e, "auth.token.url", authUrl);
this.addProp(config, e, "auth.system.username", "System Username");
this.addProp(config, e, "cauth.system.password", "System Password");
TokenContainer.init(config);
} catch (IOException arg3) {
arg3.printStackTrace();
}
}
private void addProp(Properties config, ServletContext context, String propName, String descrip) {
String propVal = (String) context.getAttribute(propName);
if (StringUtils.isEmpty(propVal)) {
propVal = context.getInitParameter(propName);
}
if (StringUtils.isNotEmpty(propVal)) {
config.put(propName, propVal);
} else {
throw new RuntimeException("error: ");
}
}
}
答案 1 :(得分:1)
将以下内容添加到application.properties
server.servlet.context-parameters.auth.token.url=<your-value>
server.servlet.context-parameters.auth.system.username=<your-value>
server.servlet.context-parameters.auth.system.password=<your-value>
这会将值公开为上下文参数。