spring 如何使用 WebApplicationInitializer 配置@EnableConfigurationProperties、@ConfigurationProperties?

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/29531930/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-09-08 00:29:36  来源:igfitidea点击:

How to config @EnableConfigurationProperties, @ConfigurationProperties with WebApplicationInitializer?

springspring-mvcspring-bootspring-java-config

提问by ItsHyman

I want to read application.properties using

我想阅读 application.properties 使用

@EnableConfigurationProperties and @ConfigurationProperties.

I am able to do that with the following codes:

我可以使用以下代码做到这一点:

Application.java

@SpringBootApplication
@EnableConfigurationProperties(ApplicationConfiguration.class)
public class Application {

    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}


ApplicationConfiguration.java

@ConfigurationProperties(prefix = "server")
public class ApplicationConfiguration {

    private String port;

    public String getPort() {
        return port;
    }

    public void setPort(String port) {
        this.port = port;
    }
}

TestController.java

@Controller
public class TestController {

    @Autowired
    ApplicationConfiguration applicationConfiguration;

    @RequestMapping("/test")
    @ResponseBody
    public String test() {
        if (applicationConfiguration != null) {
            return applicationConfiguration.getPort();
        }
        return "1";
    }
}

application.properties

server.port = 8085

Now I want to replace SpringBoot(Application.java)with WebApplicationInitializerso that I can use an external container. Here is my code:

现在我想替换为SpringBoot(Application.java)WebApplicationInitializer以便我可以使用外部容器。这是我的代码:

CommonInitializer.java

public class CommonInitializer implements WebApplicationInitializer{
    @Override
    public void onStartup(ServletContext servletContext) throws ServletException {

        AnnotationConfigWebApplicationContext annotationConfigWebApplicationContext = new AnnotationConfigWebApplicationContext();
        annotationConfigWebApplicationContext.register(WebConfiguration.class);
        annotationConfigWebApplicationContext.setServletContext(servletContext);

        ServletRegistration.Dynamic servlet = servletContext.addServlet("dispatcher", new DispatcherServlet(annotationConfigWebApplicationContext));

        servlet.setLoadOnStartup(1);
        servlet.addMapping("/");
    }
} 

WebConfiguration.java

@Configuration
@EnableWebMvc
@ComponentScan(basePackages = "hello")
@EnableAutoConfiguration
@EnableConfigurationProperties(ApplicationConfiguration.class)
public class WebConfiguration {

    @Bean
    public ViewResolver viewResolver() {
        InternalResourceViewResolver viewResolver = new InternalResourceViewResolver();
        viewResolver.setViewClass(JstlView.class);
        viewResolver.setPrefix("/WEB-INF/views/");
        viewResolver.setSuffix(".jsp");

        return viewResolver;
    }
}

After doing this, I am not able to get the port(port is null, applicationConfiguration is not null) in application.proerties. Any idea? What am I missing?

这样做之后,我无法在application.proerties. 任何的想法?我错过了什么?

回答by ItsHyman

Problem solved. I am missing property file location!!

问题解决了。我缺少属性文件位置!

@ConfigurationProperties(prefix = "server", locations = "classpath:application.properties")

Seems spring boot does that for you automatically.

似乎 spring boot 会自动为你做这件事。