SpringBoot微服务如何使用java配置在应用程序上下文中设置属性

时间:2018-02-15 14:11:20

标签: java spring spring-boot microservices applicationcontext

我有一个基于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,但没有运气。如何在应用程序上下文中设置这三个道具,并使该侦听器自动启动。

2 个答案:

答案 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>

这会将值公开为上下文参数。