JBoss5.0下启动Struts2+spring+hibernate项目

来源:百度文库 编辑:神马文学网 时间:2024/05/03 06:06:10
Jboss5.0.0下,项目使用Struts2.1.6+Spring2.5.5+Hibernate3(使用JPA的Hibernate实现)框架,但是在Jboss下启动时总是抛出“java.lang.RuntimeException: Specification violation [EJB3 JPA 6.2.1.2] - You have not defined a non-jta-data-source for a RESOURCE_LOCAL enabled persistence context named: esys”的错误,错误信息如下:
15:38:56,359 INFO  [PersistenceUnitDeployment] Starting persistence unit persistence.unit:unitName=#esys
15:38:56,375 ERROR [AbstractKernelController] Error installing to Start: name=persistence.unit:unitName=#esys state=Create
java.lang.RuntimeException: Specification violation [EJB3 JPA 6.2.1.2] - You have not defined a non-jta-data-source for a RESOURCE_LOCAL enabled persistence context named: esys
at org.jboss.jpa.deployment.PersistenceUnitInfoImpl.(PersistenceUnitInfoImpl.java:124)
at org.jboss.jpa.deployment.PersistenceUnitDeployment.start(PersistenceUnitDeployment.java:285)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at org.jboss.reflect.plugins.introspection.ReflectionUtils.invoke(ReflectionUtils.java:59)
at org.jboss.reflect.plugins.introspection.ReflectMethodInfoImpl.invoke(ReflectMethodInfoImpl.java:150)
at org.jboss.joinpoint.plugins.BasicMethodJoinPoint.dispatch(BasicMethodJoinPoint.java:66)
at org.jboss.kernel.plugins.dependency.KernelControllerContextAction$JoinpointDispatchWrapper.execute(KernelControllerContextAction.java:241)
at org.jboss.kernel.plugins.dependency.ExecutionWrapper.execute(ExecutionWrapper.java:47)
at org.jboss.kernel.plugins.dependency.KernelControllerContextAction.dispatchExecutionWrapper(KernelControllerContextAction.java:109)
at org.jboss.kernel.plugins.dependency.KernelControllerContextAction.dispatchJoinPoint(KernelControllerContextAction.java:70)
at org.jboss.kernel.plugins.dependency.LifecycleAction.installActionInternal(LifecycleAction.java:221)
at org.jboss.kernel.plugins.dependency.InstallsAwareAction.installAction(InstallsAwareAction.java:54)
at org.jboss.kernel.plugins.dependency.InstallsAwareAction.installAction(InstallsAwareAction.java:42)
at org.jboss.dependency.plugins.action.SimpleControllerContextAction.simpleInstallAction(SimpleControllerContextAction.java:62)
at org.jboss.dependency.plugins.action.AccessControllerContextAction.install(AccessControllerContextAction.java:71)
at org.jboss.dependency.plugins.AbstractControllerContextActions.install(AbstractControllerContextActions.java:51)
at org.jboss.dependency.plugins.AbstractControllerContext.install(AbstractControllerContext.java:348)
at org.jboss.dependency.plugins.AbstractController.install(AbstractController.java:1598)
at org.jboss.dependency.plugins.AbstractController.incrementState(AbstractController.java:934)
at org.jboss.dependency.plugins.AbstractController.resolveContexts(AbstractController.java:1062)
at org.jboss.dependency.plugins.AbstractController.resolveContexts(AbstractController.java:984)
at org.jboss.dependency.plugins.AbstractController.install(AbstractController.java:774)
at org.jboss.dependency.plugins.AbstractController.install(AbstractController.java:540)
at org.jboss.deployers.vfs.deployer.kernel.BeanMetaDataDeployer.deploy(BeanMetaDataDeployer.java:121)
at org.jboss.deployers.vfs.deployer.kernel.BeanMetaDataDeployer.deploy(BeanMetaDataDeployer.java:51)
at org.jboss.deployers.spi.deployer.helpers.AbstractSimpleRealDeployer.internalDeploy(AbstractSimpleRealDeployer.java:62)
at org.jboss.deployers.spi.deployer.helpers.AbstractRealDeployer.deploy(AbstractRealDeployer.java:50)
at org.jboss.deployers.plugins.deployers.DeployerWrapper.deploy(DeployerWrapper.java:171)
at org.jboss.deployers.plugins.deployers.DeployersImpl.doDeploy(DeployersImpl.java:1439)
at org.jboss.deployers.plugins.deployers.DeployersImpl.doInstallParentFirst(DeployersImpl.java:1157)
at org.jboss.deployers.plugins.deployers.DeployersImpl.doInstallParentFirst(DeployersImpl.java:1178)
at org.jboss.deployers.plugins.deployers.DeployersImpl.install(DeployersImpl.java:1098)
at org.jboss.dependency.plugins.AbstractControllerContext.install(AbstractControllerContext.java:348)
at org.jboss.dependency.plugins.AbstractController.install(AbstractController.java:1598)
at org.jboss.dependency.plugins.AbstractController.incrementState(AbstractController.java:934)
at org.jboss.dependency.plugins.AbstractController.resolveContexts(AbstractController.java:1062)
at org.jboss.dependency.plugins.AbstractController.resolveContexts(AbstractController.java:984)
at org.jboss.dependency.plugins.AbstractController.change(AbstractController.java:822)
at org.jboss.dependency.plugins.AbstractController.change(AbstractController.java:553)
at org.jboss.deployers.plugins.deployers.DeployersImpl.process(DeployersImpl.java:781)
at org.jboss.deployers.plugins.main.MainDeployerImpl.process(MainDeployerImpl.java:545)
at org.jboss.system.server.profileservice.ProfileServiceBootstrap.loadProfile(ProfileServiceBootstrap.java:304)
at org.jboss.system.server.profileservice.ProfileServiceBootstrap.start(ProfileServiceBootstrap.java:205)
at org.jboss.bootstrap.AbstractServerImpl.start(AbstractServerImpl.java:405)
at org.jboss.Main.boot(Main.java:209)
at org.jboss.Main$1.run(Main.java:547)
at java.lang.Thread.run(Thread.java:619)
15:38:57,843 INFO  [TomcatDeployment] deploy, ctxPath=/eSys, vfsUrl=eSys.war
反编译了jboss安装目录下common\lib中的“jboss-jpa-deployers.jar”文件,发现此文件中抛出异常的“PersistenceUnitInfoImpl”类,有这么几句代码:
if (metaData.getProvider() != null) { setPersistenceProviderClassName(metaData.getProvider());
}
if (metaData.getJtaDataSource() != null)
{
setJtaDataSource((DataSource)ctx.lookup(metaData.getJtaDataSource()));
}
else if (transactionType == PersistenceUnitTransactionType.JTA)
{
throw new RuntimeException("Specification violation [EJB3 JPA 6.2.1.2] - You have not defined a jta-data-source for a JTA enabled persistence context named: " + metaData.getName());
}
if (metaData.getNonJtaDataSource() != null)
{
setNonJtaDataSource((DataSource)ctx.lookup(metaData.getNonJtaDataSource()));
}
else if (transactionType == PersistenceUnitTransactionType.RESOURCE_LOCAL)
{
throw new RuntimeException("Specification violation [EJB3 JPA 6.2.1.2] - You have not defined a non-jta-data-source for a RESOURCE_LOCAL enabled persistence context named: " + metaData.getName());
}
按照这个意思就是persistence.xml中必须至少配置一个JNDI数据源,但是我使用的是spring管理的数据源,这个地方怎么会出现这种问题呢?
把配置文件贴出来
applicationContext_hibernate.xml
Xml代码

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd">

class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">


/WEB-INF/springConfig/esys.properties






${jdbc.driverClassName}


${jdbc.url}&user=${jdbc.username}&password=${jdbc.password}

 
${jdbc.username}

 
${jdbc.password}


datapool


7200000


5


100


10


true


true



class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"
scope="singleton">







${hibernate.database}


${hibernate.show_sql}


${hibernate.generateDdl}

















PROPAGATION_REQUIRED,-Exception
PROPAGATION_REQUIRED,-Exception
PROPAGATION_REQUIRED,-Exception
PROPAGATION_REQUIRED,-Exception
PROPAGATION_REQUIRED,-Exception
PROPAGATION_REQUIRED,-Exception
PROPAGATION_REQUIRED,-Exception
PROPAGATION_REQUIRED,-Exception
PROPAGATION_REQUIRED,-Exception
PROPAGATION_REQUIRED,-Exception
PROPAGATION_REQUIRED,-Exception




/WEB-INF/springConfig/esys.properties${jdbc.driverClassName}${jdbc.url}&user=${jdbc.username}&password=${jdbc.password} ${jdbc.username} ${jdbc.password}datapool7200000510010truetrue${hibernate.database}${hibernate.show_sql}${hibernate.generateDdl}PROPAGATION_REQUIRED,-ExceptionPROPAGATION_REQUIRED,-ExceptionPROPAGATION_REQUIRED,-ExceptionPROPAGATION_REQUIRED,-ExceptionPROPAGATION_REQUIRED,-ExceptionPROPAGATION_REQUIRED,-ExceptionPROPAGATION_REQUIRED,-ExceptionPROPAGATION_REQUIRED,-ExceptionPROPAGATION_REQUIRED,-ExceptionPROPAGATION_REQUIRED,-ExceptionPROPAGATION_REQUIRED,-Exception
persistence.xml
Xml代码

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/persistence
http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd"
version="1.0">

org.hibernate.ejb.HibernatePersistence








org.hibernate.ejb.HibernatePersistence
web.xml
eSysflex.class.path/WEB-INF/flex/hotfixes,/WEB-INF/flex/jarscontextConfigLocation/WEB-INF/springConfig/*.xmlencodingFilterorg.springframework.web.filter.CharacterEncodingFilterencodingUTF-8struts2org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilterencodingFilter/*struts2/*org.springframework.web.context.ContextLoaderListenerflex.messaging.HttpFlexSessionMessageBrokerServletflex.messaging.MessageBrokerServletservices.configuration.file/WEB-INF/flex/services-config.xmlflex.write.path/WEB-INF/flex1MessageBrokerServlet/messagebroker/*index.html
问题补充:
persistence.xml中“persistence-unit”是必须的,而且必须与applicationContext中指定的“persistenceUnitName”同名,再加上系统不使用JTA事物,transaction-type="RESOURCE_LOCAL"好像也是必须。其他的配置信息曾经去掉过,可是不起作用。倒是在persistence.xml中加上一个空的启动的时候不再抛异常了。