过去两周,我的申请表现一直很好。昨晚我远程登录工作,发现当我运行我的应用程序时,我的ApplicationContextProvider
类不再了解应用程序上下文。我已经运行了Maven clean&除了重新启动我的电脑外还可以构建。似乎无法动摇它......
public class ApplicationContextProvider implements ApplicationContextAware {
private static ApplicationContext applicationContext;
public static ApplicationContext getApplicationContext() {
return applicationContext;
}
public void setApplicationContext (ApplicationContext applicationContext) {
this.applicationContext = applicationContext;
}
}
我的主要课程:
public static void main(String[] args) throws IOException {
System.setProperty("java.util.logging.SimpleFormatter.format", "%4$s: %5$s%n");
final HttpServer server = HttpServer.createSimpleServer(".", 80);
WebappContext ctx = new WebappContext("ProductionQueue", "/");
//enable annotation configuration
ctx.addContextInitParameter("contextClass", "org.springframework.web.context.support.AnnotationConfigWebApplicationContext");
ctx.addContextInitParameter("contextConfigLocation", "com.production");
//allow spring to do all of it's stuff
ctx.addListener("org.springframework.web.context.ContextLoaderListener");
....
ctx.deploy(server);
server.start();
//start the production process
Production.init();
System.in.read();
server.stop();
我的制作课程:
public class Production {
private static final Logger logger = Logger.getLogger(Production.class.getName());
/* A list of active workflows */
private static List<Workflow> workflowList = new ArrayList<Workflow>();
private static ProductionService productionService;
/**
* Initialize the production line
*/
public static void init() {
logger.info("Initializing production workflows...");
ApplicationContext context = ApplicationContextProvider.getApplicationContext(); //THIS IS NULL
productionService = (ProductionService) context.getBean("productionService");
根本没有修改任何配置。在我的配置类中,我确实有一个bean ...
@Configuration
@ComponentScan(basePackages = {
"com.production"
})
@PropertySource(value= {
"classpath:/application.properties",
"classpath:/environment-${FETTER_ENVIRONMENT}.properties"
})
@EnableJpaRepositories("com.production.repository")
@EnableTransactionManagement
public class Config {
@Value("${db.url}")
String PROPERTY_DATABASE_URL;
@Value("${db.user}")
String PROPERTY_DATABASE_USER;
@Value("${db.password}")
String PROPERTY_DATABASE_PASSWORD;
@Value("${persistenceUnit.default}")
String PROPERTY_DEFAULT_PERSISTENCE_UNIT;
@Value("${hibernate.dialect}")
String PROPERTY_HIBERNATE_DIALECT;
@Value("${hibernate.format_sql}")
String PROPERTY_HIBERNATE_FORMAT_SQL;
@Value("${hibernate.show_sql}")
String PROPERTY_HIBERNATE_SHOW_SQL;
@Value("${entitymanager.packages.to.scan}")
String PROPERTY_ENTITYMANAGER_PACKAGES_TO_SCAN;
@Bean
public ApplicationContextProvider applicationContextProvider() {
return new ApplicationContextProvider();
}
答案 0 :(得分:0)
我会说它之间的泥泞试图让它静止并将其用作豆子。
您创建ApplicationContextProvider
的新实例作为spring bean。这是ApplicationContextAware
,因此注入AC。但是那么你不使用所说的bean,你使用它的静态getter来读取字段,但是这个静态的东西从来没有收到过AC。你永远不会使用你真正的bean。
我会说这个提供程序是完整的,并且依赖于ApplicationContextAware
接口上的soley,它可以做你想要的,也就是说它的设计就是这样,为什么要使用委托bean呢?
答案 1 :(得分:0)
我不知道是否
@Bean
public ApplicationContextProvider applicationContextProvider() {
return new ApplicationContextProvider();
}
ApplicationContextAware
界面。
尝试在@Component
课程中添加ApplicationContextProvider
,然后移除@Bean
。我希望在正常的组件扫描中找到此类时,会考虑使用ApplicationContextAware`接口。
答案 2 :(得分:0)
事实证明,我的日志记录阻止了我访问,这是一个隐藏的异常。谢谢你的帮助。