2013-10-02 5 views
0

Я использую интерфейс Spring WebApplicationInitializer Spring, чтобы программно создать контекст приложения и использовать спящий режим с спецификацией jpa для сохранения данных. Я помещаю файл db.properties в папку src, добавляя @PropertySource ("classpath: db.properties") в класс WebAppConfig. я имею следующие банки для спящего режима в пути к классам .............org.hibernate.HibernateException: класс диалекта не найден: org.hibernate.dialect.MySQLDialect весной MVC

antlr-2.7.7.jar aopalliance-1.0.jar 
commons-dbcp-1.4-javadoc.jar 
commons-dbcp-1.4-sources.jar 
commons-dbcp-1.4.jar 
commons-logging-1.1.1.jar 
commons-pool-1.6-javadoc.jar 
commons-pool-1.6-sources.jar 
commons-pool-1.6.jar 
dom4j-1.6.1.jar 
hibernate-commons-annotations-4.0.1.Final.jar 
hibernate-core-4.1.9.Final.jar 
hibernate-entitymanager-4.1.9.Final.jar 
hibernate-jpa-2.0-api-1.0.1.Final.jar 
javassist-3.17.1-GA.jar 
jboss-logging-3.1.0.GA.jar 
jta-1.1.jar 
mysql-connector-java-5.1.6-bin.jar 

веба-коду класса initialzer

package com.genesis.init; 

import javax.servlet.ServletContext; 
import javax.servlet.ServletException; 
import javax.servlet.ServletRegistration.Dynamic; 

import org.springframework.web.WebApplicationInitializer; 
import org.springframework.web.context.support.AnnotationConfigWebApplicationContext; 
import org.springframework.web.servlet.DispatcherServlet; 

public class Initializer implements WebApplicationInitializer { 
    // gets invoked automatically when application starts up 
    public void onStartup(ServletContext servletContext) 
      throws ServletException { 
     // Create ApplicationContext. I'm using the 
     // AnnotationConfigWebApplicationContext to avoid using beans xml files. 
     AnnotationConfigWebApplicationContext ctx = new AnnotationConfigWebApplicationContext(); 
     ctx.register(WebAppConfig.class); 
     // Add the servlet mapping manually and make it initialize automatically 
     Dynamic servlet = servletContext.addServlet("dispatcher", 
       new DispatcherServlet(ctx)); 
     servlet.addMapping("/"); 
     servlet.setLoadOnStartup(1); 
    } 
} 

WebAppConfig код

package com.genesis.init; 
import java.util.Map; 
import javax.sql.DataSource; 
import org.apache.commons.dbcp.BasicDataSource; 
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.orm.jpa.JpaTransactionManager; 
import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean; 
import org.springframework.orm.jpa.support.OpenEntityManagerInViewInterceptor; 
import org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter; 
import org.springframework.transaction.PlatformTransactionManager; 
import org.springframework.transaction.annotation.EnableTransactionManagement; 
import org.springframework.web.servlet.config.annotation.DefaultServletHandlerConfigurer; 
import org.springframework.web.servlet.config.annotation.EnableWebMvc; 
import org.springframework.web.servlet.config.annotation.InterceptorRegistry; 
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter; 
import org.springframework.web.servlet.view.InternalResourceViewResolver; 


@Configuration 
// specifies this class as configuration 
@ComponentScan("com.genesis") 
// specifies which package to scan 
@EnableWebMvc 
// enable spring web mvc to use annotation 
@PropertySource("classpath:db.properties") 
// plugs in property file which located in the resource folder. 
@EnableTransactionManagement 
// enables Spring’s annotation-driven transaction management capability. 
public class WebAppConfig extends WebMvcConfigurerAdapter { 

@Autowired 
private Environment env; 

// Tell SpingMVC where to find view scripts 
@Bean 
public InternalResourceViewResolver viewResolver() { 
    InternalResourceViewResolver resolver = new InternalResourceViewResolver(); 
    resolver.setPrefix("/WEB-INF/views/"); 
    resolver.setSuffix(".jsp"); 

    return resolver; 
} 

// Enable serving static resources even when DispatcherServlet is mapped to 
@Override 
public void configureDefaultServletHandling(
     DefaultServletHandlerConfigurer configurer) { 
    configurer.enable(); 
} 

// Enable accessing entityManager from view scripts. Required when using 
// lazy loading 
@Override 
public void addInterceptors(InterceptorRegistry registry) { 
    OpenEntityManagerInViewInterceptor viewInterceptor = new OpenEntityManagerInViewInterceptor(); 
    viewInterceptor.setEntityManagerFactory(entityManagerFactory().getObject()); 
    registry.addWebRequestInterceptor(viewInterceptor); 
} 

//Set up dataSource to be used by Hibernate. Also make sure the connection doesn't go down 
@Bean 
public DataSource getDataSource() { 
    BasicDataSource dataSource = new BasicDataSource(); 
    dataSource.setUrl(env.getProperty("url")); 
    dataSource.setDriverClassName(env.getProperty("driver")); 
    dataSource.setUsername(env.getProperty("user")); 
    dataSource.setPassword(env.getProperty("pass")); 
    dataSource.setValidationQueryTimeout(5); 
    return dataSource; 
} 

//Set up JPA and transactionManager 
@Bean 
public LocalContainerEntityManagerFactoryBean entityManagerFactory() { 
    LocalContainerEntityManagerFactoryBean emf = new LocalContainerEntityManagerFactoryBean(); 
    emf.setDataSource(getDataSource()); 
    emf.setPackagesToScan("com.genesis.model"); 

    // let Hibernate know which database we're using. 
    // note that this is vendor specific, not JPA 
    Map<String, Object> opts = emf.getJpaPropertyMap(); 
    opts.put("hibernate.dialect", env.getProperty("hibernate.dialect")); 
    HibernateJpaVendorAdapter va = new HibernateJpaVendorAdapter(); 
    emf.setJpaVendorAdapter(va); 

    return emf; 
} 

//Let us use PlatformTransactionManager directly to implement programmatic approach to implement transactions 
    //To start a new transaction you need to have a instance of TransactionDefinition 
    @Bean 
    public PlatformTransactionManager transactionManager(){ 
     JpaTransactionManager transactionManager=new JpaTransactionManager(); 
     transactionManager.setEntityManagerFactory(entityManagerFactory().getObject()); 
     return transactionManager(); 
    } 
} 

свойство базы данных файл как.

driver=com.mysql.jdbc.Driver 
    url=jdbc:mysql://localhost:3306/test 
    hibernate.dialect=org.hibernate.dialect.MySQLDialect 
    user=root 
    pass=iems1234 
    show_sql=true 
    packages.to.scan=com.genesis.model 

выход консоли ...........

SEVERE: Context initialization failed 
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'entityManagerFactory' defined in class com.genesis.init.WebAppConfig: Invocation of init method failed; nested exception is javax.persistence.PersistenceException: [PersistenceUnit: default] Unable to build EntityManagerFactory 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1507) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:539) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:475) 
    at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:299) 
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:228) 
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:295) 
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:195) 
    at org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:1145) 
    at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:922) 
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:493) 
    at org.springframework.web.servlet.FrameworkServlet.configureAndRefreshWebApplicationContext(FrameworkServlet.java:658) 
    at org.springframework.web.servlet.FrameworkServlet.initWebApplicationContext(FrameworkServlet.java:512) 
    at org.springframework.web.servlet.FrameworkServlet.initServletBean(FrameworkServlet.java:466) 
    at org.springframework.web.servlet.HttpServletBean.init(HttpServletBean.java:136) 
    at javax.servlet.GenericServlet.init(GenericServlet.java:160) 
    at org.apache.catalina.core.StandardWrapper.initServlet(StandardWrapper.java:1267) 
    at org.apache.catalina.core.StandardWrapper.load(StandardWrapper.java:1084) 
    at org.apache.catalina.core.StandardContext.loadOnStartup(StandardContext.java:5027) 
    at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5314) 
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150) 
    at org.apache.catalina.core.StandardContext.reload(StandardContext.java:3920) 
    at org.apache.catalina.loader.WebappLoader.backgroundProcess(WebappLoader.java:426) 
    at org.apache.catalina.core.ContainerBase.backgroundProcess(ContainerBase.java:1345) 
    at org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.processChildren(ContainerBase.java:1530) 
    at org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.processChildren(ContainerBase.java:1540) 
    at org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.processChildren(ContainerBase.java:1540) 
    at org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.run(ContainerBase.java:1519) 
    at java.lang.Thread.run(Thread.java:722) 
Caused by: javax.persistence.PersistenceException: [PersistenceUnit: default] Unable to build EntityManagerFactory 
    at org.hibernate.ejb.Ejb3Configuration.buildEntityManagerFactory(Ejb3Configuration.java:915) 
    at org.hibernate.ejb.Ejb3Configuration.buildEntityManagerFactory(Ejb3Configuration.java:890) 
    at org.hibernate.ejb.HibernatePersistence.createContainerEntityManagerFactory(HibernatePersistence.java:74) 
    at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.createNativeEntityManagerFactory(LocalContainerEntityManagerFactoryBean.java:293) 
    at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.afterPropertiesSet(AbstractEntityManagerFactoryBean.java:317) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1566) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1503) 
    ... 27 more 
Caused by: org.hibernate.HibernateException: Dialect class not found: org.hibernate.dialect.MySQLDialect 
    at org.hibernate.service.jdbc.dialect.internal.DialectFactoryImpl.constructDialect(DialectFactoryImpl.java:76) 
    at org.hibernate.service.jdbc.dialect.internal.DialectFactoryImpl.buildDialect(DialectFactoryImpl.java:64) 
    at org.hibernate.engine.jdbc.internal.JdbcServicesImpl.configure(JdbcServicesImpl.java:170) 
    at org.hibernate.service.internal.StandardServiceRegistryImpl.configureService(StandardServiceRegistryImpl.java:75) 
    at org.hibernate.service.internal.AbstractServiceRegistryImpl.initializeService(AbstractServiceRegistryImpl.java:159) 
    at org.hibernate.service.internal.AbstractServiceRegistryImpl.getService(AbstractServiceRegistryImpl.java:131) 
    at org.hibernate.cfg.SettingsFactory.buildSettings(SettingsFactory.java:77) 
    at org.hibernate.cfg.Configuration.buildSettingsInternal(Configuration.java:2283) 
    at org.hibernate.cfg.Configuration.buildSettings(Configuration.java:2279) 
    at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1748) 
    at org.hibernate.ejb.EntityManagerFactoryImpl.<init>(EntityManagerFactoryImpl.java:94) 
    at org.hibernate.ejb.Ejb3Configuration.buildEntityManagerFactory(Ejb3Configuration.java:905) 
    ... 33 more 
Caused by: org.hibernate.service.classloading.spi.ClassLoadingException: Unable to load class [org.hibernate.dialect.MySQLDialect ] 
    at org.hibernate.service.classloading.internal.ClassLoaderServiceImpl.classForName(ClassLoaderServiceImpl.java:141) 
    at org.hibernate.service.jdbc.dialect.internal.DialectFactoryImpl.constructDialect(DialectFactoryImpl.java:73) 
    ... 44 more 
Caused by: java.lang.ClassNotFoundException: Could not load requested class : org.hibernate.dialect.MySQLDialect 
    at org.hibernate.service.classloading.internal.ClassLoaderServiceImpl$1.findClass(ClassLoaderServiceImpl.java:99) 
    at java.lang.ClassLoader.loadClass(ClassLoader.java:423) 
    at java.lang.ClassLoader.loadClass(ClassLoader.java:356) 
    at java.lang.Class.forName0(Native Method) 
    at java.lang.Class.forName(Class.java:266) 
    at org.hibernate.service.classloading.internal.ClassLoaderServiceImpl.classForName(ClassLoaderServiceImpl.java:138) 
    ... 45 more 
+0

Тот факт, что что-то на пути к классам не означает, что в вашей войне файл для развертывания. Используете ли вы maven для управления вашими зависимостями или ищете ли вы в Интернете вручную? –

+0

нет, я не использую maven, ищу интернет вручную –

ответ

1

Вы не используете Maven или Gradle в качестве инструмента сборки, так что вам придется убедиться, что все ваших необходимых файлов jar находятся в каталоге вашего веб-приложения WEB-INF/lib. Если он не находится в этом каталоге, он не находится в пути к классам.

Я настоятельно рекомендую использовать один из ранее упомянутых инструментов сборки для создания артефакта и управления вашими зависимостями. Это избавит вас от многих поисков и головных болей.

Ссылки

  1. Maven
  2. Gradle
+0

спасибо за предложение, но можете ли вы рассказать мне, какие баночки я не пропал без вести или не включены в мой проект. –

+0

Спящий барабан. Поскольку я упомянул о том, что они находятся в вашем пути к классу BUILD, это не значит, что они находятся на пути к классу RUNTIME !. –

+0

я добавить Maven DEPENDENCY org.hibernate гибернация-EntityManager 4.1.2 но это дает EntityManager не может быть решен –

Смежные вопросы