簡體   English   中英

不同上下文中的Spring bean接線

[英]Spring bean wiring in different contexts

對於數據源層,我使用以下Spring配置文件:

@Configuration
@ComponentScan(basePackages = {"com.savdev.springmvcexample.repository", "com.savdev.springmvcexample.config"})
@EnableTransactionManagement
@EnableJpaRepositories(basePackages = {"com.savdev.springmvcexample.repository"})
public class InfrastructureContextConfiguration {
...
    @Configuration
    @Profile(value = "file_based")
    @PropertySource("classpath:/db/config/file_based.properties")
    public static class FileBasedConfiguration {

        @Inject
        private Environment environment;

        @Bean
        public DataSource dataSource() {
            BasicDataSource dataSource = new org.apache.commons.dbcp.BasicDataSource();
            dataSource.setDriverClassName(environment.getProperty("jdbc.driver"));
            dataSource.setUrl(environment.getProperty("jdbc.url"));
            dataSource.setUsername(environment.getProperty("jdbc.username"));
            dataSource.setPassword(environment.getProperty("jdbc.password"));
            return dataSource;
        }
    }
...

要運行測試,我通過@ContextConfiguration加載此配置:

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = { InfrastructureContextConfiguration.class, HsqldbEmbeddableDbStarterContextConfiguration.class })
@TransactionConfiguration(transactionManager = "transactionManager", defaultRollback = false)
@Transactional()
@ActiveProfiles(profiles = {"file_based", "test_data"} )
public abstract class AbstractJpaJavaTestBase {
...

而且效果很好。

創建DispatcherServlet時,將在Web模塊中使用相同的InfrastructureContextConfiguration類:

public class SpringMvcExampleWebApplicationInitializer implements WebApplicationInitializer {

    @Override
    public void onStartup(ServletContext servletContext) throws ServletException {
        registerDispatcherServlet(servletContext);
    }

    private void registerDispatcherServlet(final ServletContext servletContext) {
        WebApplicationContext dispatcherContext = createContext(WebMvcContextConfiguration.class, InfrastructureContextConfiguration.class);
        DispatcherServlet dispatcherServlet = new DispatcherServlet(dispatcherContext);
        dispatcherServlet.setContextInitializers( new SpringMvcExampleProfilesInitializer());
        ServletRegistration.Dynamic dispatcher;
        dispatcher = servletContext.addServlet("dispatcher", dispatcherServlet);
        dispatcher.setLoadOnStartup(1);
        dispatcher.addMapping("/");
    }

    private WebApplicationContext createContext(final Class<?>... annotatedClasses) {
        AnnotationConfigWebApplicationContext context = new AnnotationConfigWebApplicationContext();
        context.register(annotatedClasses);
        return context;
    }
}

但是現在,我在InfrastructureContextConfiguration的以下行中得到NullPointerException:

dataSource.setDriverClassName(environment.getProperty("jdbc.driver"));

environment未連接。 我該怎么解決?

我發現了什么。 已經遇到了類似的問題: same1,一些解決方案

似乎問題未解決,但最后的答案是最好的解決方案

total:實際上,使用@Inject注入的字段不能為null。 它必須引發異常。 結果,如果它為null,則-注釋根本沒有被應用。 結果,主要原因是沒有在類路徑中實現它。

因此,我在web.pom中添加了以下內容。 它解決了問題:

<dependency>
    <groupId>javax.inject</groupId>
    <artifactId>javax.inject</artifactId>
    <version>1</version>
</dependency>

作為替代選項,我可以使用:

  1. @Resource而不是@Inject,並且已設置環境。

  2. 將環境作為參數傳遞給構造函數,而不是通過注釋進行連接。 但是最好的情況,恕我直言,是修復罐依賴。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM