使用基于Java的配置时,Dispatcherservlet无法找到Config类

时间:2018-08-19 15:29:06

标签: java

我的项目结构是:-

Java资源

src
    com.pizzeria.config
     AppConfig.java
     MySpringDispatcherServletInitializer.java

WebContent

META-INF
    MANIFEST.MF
WEB-INF
    lib
    view
        welcome.jsp

我的AppConfig.java文件的内容

package com.pizzeria.config;

import java.util.Properties;
import java.util.logging.Logger;

import javax.persistence.EntityManagerFactory;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;
import org.springframework.core.env.Environment;
import org.springframework.jdbc.datasource.DriverManagerDataSource;
import org.springframework.orm.jpa.JpaTransactionManager;
import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean;
import org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter;
import org.springframework.transaction.PlatformTransactionManager;
import org.springframework.transaction.annotation.EnableTransactionManagement;
import org.springframework.web.servlet.ViewResolver;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import org.springframework.web.servlet.view.InternalResourceViewResolver;

@Configuration
@EnableWebMvc
@ComponentScan("com.pizzeria.*")
@PropertySource("classpath:*.properties")
@EnableTransactionManagement
public class AppConfig {

    @Autowired
    private Environment env;

    // set up a logger for diagnostics

        private Logger logger = Logger.getLogger(getClass().getName());

    // define a bean for ViewResolver

        @Bean
        public ViewResolver viewResolver() {

            InternalResourceViewResolver viewResolver = new InternalResourceViewResolver();

            viewResolver.setPrefix("/WEB-INF/view/");
            viewResolver.setSuffix(".jsp");

            return viewResolver;
        }


         @Bean
           public PlatformTransactionManager transactionManager(
             EntityManagerFactory emf){
               JpaTransactionManager transactionManager = new JpaTransactionManager();
               transactionManager.setEntityManagerFactory(emf);
               return transactionManager;
           }

        @Bean
        public LocalContainerEntityManagerFactoryBean localEntityManagerFactory() {
            LocalContainerEntityManagerFactoryBean localEntityManagerFactory = new LocalContainerEntityManagerFactoryBean();
            localEntityManagerFactory.setDataSource(dataSource());
            localEntityManagerFactory.setPackagesToScan("com.pizzeria");
            localEntityManagerFactory.setJpaVendorAdapter(hibernateJpaVendorAdapter());
            localEntityManagerFactory.setJpaProperties(additionalProperties());
            return localEntityManagerFactory;
        }

        @Bean
        public HibernateJpaVendorAdapter hibernateJpaVendorAdapter() {
            HibernateJpaVendorAdapter hibernateJpaVendorAdapter = new HibernateJpaVendorAdapter();
            return hibernateJpaVendorAdapter;
        }

        Properties additionalProperties() {
               Properties properties = new Properties();
               properties.setProperty("hibernate.hbm2ddl.auto",
                                        env.getProperty("hibernate.hbm2ddl.auto"));
               properties.setProperty("hibernate.dialect", 
                                        env.getProperty("hibernate.dialect"));
               properties.setProperty("hibernate.cache.use_second_level_cache", 
                                        env.getProperty("hibernate.cache.use_second_level_cache"));
               properties.setProperty("hibernate.cache.use_query_cache", 
                                        env.getProperty("hibernate.cache.use_query_cache"));
               properties.setProperty("hibernate.show_sql",
                                        env.getProperty("hibernate.show_sql"));
               properties.setProperty("hibernate.format_sql", 
                                        env.getProperty("hibernate.format_sql"));

               return properties;
           }

        @Bean
        public DriverManagerDataSource dataSource() {
            DriverManagerDataSource dataSource = new DriverManagerDataSource();

            dataSource.setDriverClassName(env.getProperty("jdbc.driver"));
            dataSource.setUrl(env.getProperty("jdbc.url"));
            dataSource.setUsername(env.getProperty("jdbc.user"));
            dataSource.setPassword(env.getProperty("jdbc.password"));
            return dataSource;
        }
}

我的DispatcherServetInitializer的内容

package com.pizzeria.config;

import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer;

public class MySpringDispatcherServletInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {

    @Override
    protected Class<?>[] getRootConfigClasses() {
        // TODO Auto-generated method stub
        return null;
    }

    @Override
    protected Class<?>[] getServletConfigClasses() {
        return new Class [] {AppConfig.class};
    }

    @Override
    protected String[] getServletMappings() {
        return new String [] {"/"};
    }



}

在tomcat上运行应用程序时出现的错误:-

19-Aug-2018 20:13:37.805 INFO [localhost-startStop-1] org.apache.catalina.core.ApplicationContext.log 3 Spring WebApplicationInitializers detected on classpath
19-Aug-2018 20:13:37.936 INFO [localhost-startStop-1] org.apache.catalina.core.ApplicationContext.log Initializing Spring root WebApplicationContext
19-Aug-2018 20:13:38.055 SEVERE [localhost-startStop-1] org.apache.catalina.core.StandardContext.listenerStart Exception sending context initialized event to listener instance of class [org.springframework.web.context.ContextLoaderListener]
 org.springframework.beans.factory.BeanDefinitionStoreException: IOException parsing XML document from class path resource [applicationContext.xml]; nested exception is java.io.FileNotFoundException: class path resource [applicationContext.xml] cannot be opened because it does not exist
    at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(XmlBeanDefinitionReader.java:343)
    at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(XmlBeanDefinitionReader.java:303)
    at org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:187)
    at org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:223)
    at org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:194)
    at org.springframework.web.context.support.XmlWebApplicationContext.loadBeanDefinitions(XmlWebApplicationContext.java:125)
    at org.springframework.web.context.support.XmlWebApplicationContext.loadBeanDefinitions(XmlWebApplicationContext.java:94)
    at org.springframework.context.support.AbstractRefreshableApplicationContext.refreshBeanFactory(AbstractRefreshableApplicationContext.java:133)
    at org.springframework.context.support.AbstractApplicationContext.obtainFreshBeanFactory(AbstractApplicationContext.java:620)
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:521)
    at org.springframework.web.context.ContextLoader.configureAndRefreshWebApplicationContext(ContextLoader.java:409)
    at org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:291)
    at org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:103)
    at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:4790)
    at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5256)
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
    at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:754)
    at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:730)
    at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:734)
    at org.apache.catalina.startup.HostConfig.deployWAR(HostConfig.java:985)
    at org.apache.catalina.startup.HostConfig$DeployWar.run(HostConfig.java:1857)
    at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
    at java.util.concurrent.FutureTask.run(FutureTask.java:266)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
    at java.lang.Thread.run(Thread.java:745)
Caused by: java.io.FileNotFoundException: class path resource [applicationContext.xml] cannot be opened because it does not exist
    at org.springframework.core.io.ClassPathResource.getInputStream(ClassPathResource.java:180)
    at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(XmlBeanDefinitionReader.java:329)
    ... 25 more

19-Aug-2018 20:13:38.078 INFO [localhost-startStop-1] org.apache.catalina.core.ApplicationContext.log Closing Spring root WebApplicationContext
19-Aug-2018 20:13:38.085 SEVERE [localhost-startStop-1] org.apache.catalina.core.StandardContext.listenerStop Exception sending context destroyed event to listener instance of class [org.springframework.web.context.ContextLoaderListener]
 java.lang.IllegalStateException: BeanFactory not initialized or already closed - call 'refresh' before accessing beans via the ApplicationContext
    at org.springframework.context.support.AbstractRefreshableApplicationContext.getBeanFactory(AbstractRefreshableApplicationContext.java:176)
    at org.springframework.context.support.AbstractApplicationContext.destroyBeans(AbstractApplicationContext.java:1037)
    at org.springframework.context.support.AbstractApplicationContext.doClose(AbstractApplicationContext.java:1013)
    at org.springframework.context.support.AbstractApplicationContext.close(AbstractApplicationContext.java:963)
    at org.springframework.web.context.ContextLoader.closeWebApplicationContext(ContextLoader.java:525)
    at org.springframework.web.context.ContextLoaderListener.contextDestroyed(ContextLoaderListener.java:112)
    at org.apache.catalina.core.StandardContext.listenerStop(StandardContext.java:4837)
    at org.apache.catalina.core.StandardContext.stopInternal(StandardContext.java:5478)
    at org.apache.catalina.util.LifecycleBase.stop(LifecycleBase.java:226)
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:154)
    at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:754)
    at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:730)
    at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:734)
    at org.apache.catalina.startup.HostConfig.deployWAR(HostConfig.java:985)
    at org.apache.catalina.startup.HostConfig$DeployWar.run(HostConfig.java:1857)
    at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
    at java.util.concurrent.FutureTask.run(FutureTask.java:266)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
    at java.lang.Thread.run(Thread.java:745)

如何解决此错误?我进行了很多搜索,但是到处都在说要在配置类上使用@EnableWebMvc。我已经在config类中有了它。但是仍然不知道为什么容器正在寻找applicationContext.xml。 谁能帮助我摆脱这个错误

我正在使用spring-webmvc 5版本,并且还从雄猫中删除了web.xml文件

1 个答案:

答案 0 :(得分:0)

需要根配置,而servlet配置是可选的。

要修复:new Class [] {AppConfig.class}移至getRootConfigClasses()

根据AbstractAnnotationConfigDispatcherServletInitializer的javadoc中的文档

  

需要实施才能实现:

     
      
  • getRootConfigClasses()-用于“根”应用程序上下文(非Web基础结构)配置。
  •   
  • getServletConfigClasses()-用于DispatcherServlet应用程序上下文(Spring MVC基础结构)配置。
  •   
     

如果不需要应用程序上下文层次结构,则应用程序可以通过getRootConfigClasses()返回所有配置,并从null返回getServletConfigClasses()

另请参阅StackOverflow问题getServletConfigClasses() vs getRootConfigClasses()` when extending AbstractAnnotationConfigDispatcherServletInitializer