java - Transaction error in Spring -
i have project https://github.com/ivartanian/onlinecontrol in spring mvc + jpa, worked spring configuration through xml. trying set project through java config (without xml). project starts, when create new user(entity user), error transaction. if create entity error not occur. if xml configuration error not occur too.
please tell me cause of error. glad of help
my xml config is:
<context:component-scan base-package="com.vizaco.onlinecontrol.service"/> <!-- enables scanning @transactional annotations --> <tx:annotation-driven/> <!-- ========================= datasource definition ========================= --> <!-- configurer replaces ${...} placeholders values properties file --> <!-- (in case, jdbc-related settings datasource definition below) --> <context:property-placeholder location="classpath:spring/data-access.properties" system-properties-mode="override"/> <!-- database initializer. if of script fails, initialization stops. --> <!-- alternative, embedded databases see <jdbc:embedded-database/>. --> <jdbc:initialize-database data-source="datasource"> <jdbc:script location="${jdbc.initlocation}"/> <jdbc:script location="${jdbc.datalocation}"/> </jdbc:initialize-database> <!-- datasource configuration jetty jdbc connection --> <bean id="datasource" class="org.hsqldb.jdbc.jdbcdatasource"> <property name="url"> <value>${jdbc.url}</value> </property> <property name="user"> <value>${jdbc.username}</value> </property> <property name="password"> <value>${jdbc.password}</value> </property> </bean> <context:component-scan base-package="com.vizaco.onlinecontrol.dao.jpa"/> <context:component-scan base-package="com.vizaco.onlinecontrol.security"/> <context:component-scan base-package="com.vizaco.onlinecontrol.configuration"/> <bean id="entitymanagerfactory" class="org.springframework.orm.jpa.localcontainerentitymanagerfactorybean" p:datasource-ref="datasource"> <property name="jpavendoradapter"> <bean class="org.springframework.orm.jpa.vendor.hibernatejpavendoradapter" p:database="${jpa.database}" p:showsql="${jpa.showsql}"/> <!-- 'database' parameter refers database dialect being used. default, hibernate use 'hsql' dialect because 'jpa.database' has been set 'hsql' inside file spring/data-access.properties --> </property> </bean> <!-- transaction manager single jpa entitymanagerfactory (alternative jta) --> <bean id="transactionmanager" class="org.springframework.orm.jpa.jpatransactionmanager" p:entitymanagerfactory-ref="entitymanagerfactory"/> <bean class="org.springframework.dao.annotation.persistenceexceptiontranslationpostprocessor"/> <!-- voters --> <bean id="accessdecisionmanager" class="org.springframework.security.access.vote.affirmativebased"> <constructor-arg name="decisionvoters"> <list> <bean class="org.springframework.security.access.vote.rolevoter"/> </list> </constructor-arg> </bean> <!--<bean id="expressionhandler" class="org.springframework.security.access.expression.method.defaultmethodsecurityexpressionhandler">--> <!--<property name="permissionevaluator" ref="custompermissionevaluator"/>--> <!--</bean>--> <!--<bean id="custompermissionevaluator" class="com.vizaco.onlinecontrol.security.impl.custompermissionevaluator"/>--> <!-- security --> <bean id="passwordencoder" class="org.springframework.security.crypto.bcrypt.bcryptpasswordencoder"> <constructor-arg name="strength" value="11"/> </bean> <!-- validators --> <bean id="uservalidator" class="com.vizaco.onlinecontrol.validators.uservalidator"/> <!-- messages --> <bean id="messagesource" class="org.springframework.context.support.reloadableresourcebundlemessagesource"> <property name="basename" value="classpath:messages"/> <property name="defaultencoding" value="utf-8"/> </bean> <bean id="localeresolver" class="org.springframework.web.servlet.i18n.cookielocaleresolver"> <property name="defaultlocale" value="ru"/> </bean> <!-- converters --> <bean id="conversionservice" class="org.springframework.format.support.formattingconversionservicefactorybean"> <property name="converters"> <set> <bean class="com.vizaco.onlinecontrol.converters.stringtoclazz"/> <bean class="com.vizaco.onlinecontrol.converters.stringtouser"/> </set> </property> </bean> </beans> my java config is:
@configuration @enablewebmvc @enableaspectjautoproxy @enabletransactionmanagement @componentscan({ "com.vizaco.onlinecontrol.aspects", "com.vizaco.onlinecontrol.configuration", "com.vizaco.onlinecontrol.controller", "com.vizaco.onlinecontrol.dao", "com.vizaco.onlinecontrol.model", "com.vizaco.onlinecontrol.validators", "com.vizaco.onlinecontrol.security", "com.vizaco.onlinecontrol.service"}) @propertysource("classpath:spring/data-access.properties") public class webconfig extends webmvcconfigureradapter implements transactionmanagementconfigurer { @autowired environment environment; @autowired private clazzservice clazzservice; @autowired private userservice userservice; @autowired private methodsecuritymetadatasourceadvisor sourceadvisor; @bean public userdetailsservice userdetailsservice() { return new customuserdetailsserviceimpl(); } @bean public passwordencoder passwordencoder() { return new bcryptpasswordencoder(); } @bean public datasource datasource() { jdbcdatasource datasource = new jdbcdatasource(); datasource.seturl(environment.getproperty("jdbc.url")); datasource.setuser(environment.getproperty("jdbc.username")); datasource.setpassword(environment.getproperty("jdbc.password")); return datasource; } @bean public datasourceinitializer datasourceinitializer() { datasourceinitializer datasourceinitializer = new datasourceinitializer(); datasourceinitializer.setdatasource(datasource()); compositedatabasepopulator compositedatabasepopulator = new compositedatabasepopulator(); compositedatabasepopulator.addpopulators(new resourcedatabasepopulator(new defaultresourceloader().getresource(environment.getproperty("jdbc.initlocation")))); compositedatabasepopulator.addpopulators(new resourcedatabasepopulator(new defaultresourceloader().getresource(environment.getproperty("jdbc.datalocation")))); datasourceinitializer.setdatabasepopulator(compositedatabasepopulator); return datasourceinitializer; } @bean public localcontainerentitymanagerfactorybean entitymanagerfactory() { localcontainerentitymanagerfactorybean em = new localcontainerentitymanagerfactorybean(); em.setdatasource(datasource()); em.setpackagestoscan(new string[]{"com.vizaco.onlinecontrol.model"}); hibernatejpavendoradapter vendoradapter = new hibernatejpavendoradapter(); vendoradapter.setdatabase(database.hsql); vendoradapter.setshowsql(true); em.setjpavendoradapter(vendoradapter); properties properties = new properties(); properties.setproperty("hibernate.dialect", "org.hibernate.dialect.hsqldialect"); em.setjpaproperties(properties); return em; } @bean public platformtransactionmanager txmanager() { jpatransactionmanager transactionmanager = new jpatransactionmanager(); transactionmanager.setentitymanagerfactory(entitymanagerfactory().getobject()); return transactionmanager; } @override public platformtransactionmanager annotationdriventransactionmanager() { return txmanager(); } @bean public persistenceexceptiontranslationpostprocessor exceptiontranslation() { return new persistenceexceptiontranslationpostprocessor(); } @override public void addresourcehandlers(resourcehandlerregistry registry) { registry.addresourcehandler("/web-inf/jsp/**").addresourcelocations("/jsp/"); registry.addresourcehandler("/resources/**").addresourcelocations("/resources/"); registry.addresourcehandler("/webjars/**").addresourcelocations("classpath:/meta-inf/resources/webjars/"); } @override public void configuredefaultservlethandling(defaultservlethandlerconfigurer configurer) { configurer.enable(); } @override public void configurecontentnegotiation(contentnegotiationconfigurer configurer) { configurer.favorpathextension(true) .usejaf(false) .ignoreacceptheader(true) .mediatype("html", mediatype.text_html) .mediatype("json", mediatype.application_json) .defaultcontenttype(mediatype.text_html); } @override public void configureviewresolvers(viewresolverregistry registry) { internalresourceviewresolver resolver = new internalresourceviewresolver(); resolver.setprefix("/web-inf/jsp/"); resolver.setsuffix(".jsp"); resolver.setviewclass(jstlview.class); registry.viewresolver(resolver); registry.beanname(); } @override public void addformatters(formatterregistry registry) { registry.addconverter(new stringtoclazz(clazzservice)); registry.addconverter(new stringtouser(userservice)); } @bean(name = "messagesource") public messagesource configuremessagesource() { reloadableresourcebundlemessagesource messagesource = new reloadableresourcebundlemessagesource(); messagesource.setbasename("classpath:messages"); messagesource.setcacheseconds(5); messagesource.setdefaultencoding("utf-8"); return messagesource; } @bean public cookielocaleresolver localeresolver() { cookielocaleresolver localeresolver = new cookielocaleresolver(); localeresolver.setdefaultlocale(new locale("ru")); return localeresolver; } } the error occurs when call this.em.persist(user) in method save(user user):
@repository public class jpauserdaoimpl implements userdao { @persistencecontext private entitymanager em; public jpauserdaoimpl() { } public jpauserdaoimpl(entitymanager em) { this.em = em; } @override public user findbyemail(string email) throws dataaccessexception { query query = this.em.createquery("select distinct user user user user.email =:email"); query.setparameter("email", email); list resultlist = query.getresultlist(); if (resultlist.isempty()) { return null; // handle no-results case } else { return (user)resultlist.get(0); } // return (user) query.getsingleresult(); } @override public user findbyid(long id) { query query = this.em.createquery("select distinct user user user user.id =:id"); query.setparameter("id", id); list resultlist = query.getresultlist(); if (resultlist.isempty()) { return null; // handle no-results case } else { return (user)resultlist.get(0); } } @override public list<user> getallusers() throws dataaccessexception { query query = this.em.createquery("select distinct user user user"); return query.getresultlist(); } @override public void save(user user) { if (user == null){ return; } if (user.getid() == null) { this.em.persist(user); } else { this.em.merge(user); } } @override public void delete(user user) throws dataaccessexception { if (user == null){ return; } this.em.remove(user); } } that error:
javax.persistence.transactionrequiredexception: no transactional entitymanager available @ org.springframework.orm.jpa.sharedentitymanagercreator$sharedentitymanagerinvocationhandler.invoke(sharedentitymanagercreator.java:275) @ com.sun.proxy.$proxy64.persist(unknown source) @ com.vizaco.onlinecontrol.dao.jpa.jpauserdaoimpl.save(jpauserdaoimpl.java:68) @ com.vizaco.onlinecontrol.service.impl.userserviceimpl.saveuser(userserviceimpl.java:51) @ com.vizaco.onlinecontrol.controller.usercontroller.createuser(usercontroller.java:112) @ com.vizaco.onlinecontrol.controller.usercontroller$$fastclassbyspringcglib$$2ef7ce5a.invoke(<generated>) @ org.springframework.cglib.proxy.methodproxy.invoke(methodproxy.java:204) @ org.springframework.aop.framework.cglibaopproxy$cglibmethodinvocation.invokejoinpoint(cglibaopproxy.java:717) @ org.springframework.aop.framework.reflectivemethodinvocation.proceed(reflectivemethodinvocation.java:157) @ org.springframework.aop.framework.adapter.methodbeforeadviceinterceptor.invoke(methodbeforeadviceinterceptor.java:52) @ org.springframework.aop.framework.reflectivemethodinvocation.proceed(reflectivemethodinvocation.java:179) @ org.springframework.aop.aspectj.aspectjafteradvice.invoke(aspectjafteradvice.java:43) @ org.springframework.aop.framework.reflectivemethodinvocation.proceed(reflectivemethodinvocation.java:179) @ org.springframework.aop.interceptor.exposeinvocationinterceptor.invoke(exposeinvocationinterceptor.java:92) @ org.springframework.aop.framework.reflectivemethodinvocation.proceed(reflectivemethodinvocation.java:179) @ org.springframework.aop.framework.cglibaopproxy$dynamicadvisedinterceptor.intercept(cglibaopproxy.java:653) @ com.vizaco.onlinecontrol.controller.usercontroller$$enhancerbyspringcglib$$9f848f41.createuser(<generated>) @ sun.reflect.nativemethodaccessorimpl.invoke0(native method) @ sun.reflect.nativemethodaccessorimpl.invoke(nativemethodaccessorimpl.java:62) @ sun.reflect.delegatingmethodaccessorimpl.invoke(delegatingmethodaccessorimpl.java:43) @ java.lang.reflect.method.invoke(method.java:483) @ org.springframework.web.method.support.invocablehandlermethod.doinvoke(invocablehandlermethod.java:221) @ org.springframework.web.method.support.invocablehandlermethod.invokeforrequest(invocablehandlermethod.java:137) @ org.springframework.web.servlet.mvc.method.annotation.servletinvocablehandlermethod.invokeandhandle(servletinvocablehandlermethod.java:110) @ org.springframework.web.servlet.mvc.method.annotation.requestmappinghandleradapter.invokehandlemethod(requestmappinghandleradapter.java:776) @ org.springframework.web.servlet.mvc.method.annotation.requestmappinghandleradapter.handleinternal(requestmappinghandleradapter.java:705) @ org.springframework.web.servlet.mvc.method.abstracthandlermethodadapter.handle(abstracthandlermethodadapter.java:85) @ org.springframework.web.servlet.dispatcherservlet.dodispatch(dispatcherservlet.java:959) @ org.springframework.web.servlet.dispatcherservlet.doservice(dispatcherservlet.java:893) @ org.springframework.web.servlet.frameworkservlet.processrequest(frameworkservlet.java:966) @ org.springframework.web.servlet.frameworkservlet.dopost(frameworkservlet.java:868) @ javax.servlet.http.httpservlet.service(httpservlet.java:707) @ org.springframework.web.servlet.frameworkservlet.service(frameworkservlet.java:842) @ javax.servlet.http.httpservlet.service(httpservlet.java:790) @ org.eclipse.jetty.servlet.servletholder.handle(servletholder.java:806) @ org.eclipse.jetty.servlet.servlethandler$cachedchain.dofilter(servlethandler.java:1669) @ org.springframework.web.filter.hiddenhttpmethodfilter.dofilterinternal(hiddenhttpmethodfilter.java:77) @ org.springframework.web.filter.onceperrequestfilter.dofilter(onceperrequestfilter.java:107) @ org.eclipse.jetty.servlet.servlethandler$cachedchain.dofilter(servlethandler.java:1652) @ org.springframework.web.filter.characterencodingfilter.dofilterinternal(characterencodingfilter.java:85) @ org.springframework.web.filter.onceperrequestfilter.dofilter(onceperrequestfilter.java:107) @ org.eclipse.jetty.servlet.servlethandler$cachedchain.dofilter(servlethandler.java:1652) @ org.springframework.security.web.filterchainproxy$virtualfilterchain.dofilter(filterchainproxy.java:330) @ org.springframework.security.web.access.intercept.filtersecurityinterceptor.invoke(filtersecurityinterceptor.java:118) @ org.springframework.security.web.access.intercept.filtersecurityinterceptor.dofilter(filtersecurityinterceptor.java:84) @ org.springframework.security.web.filterchainproxy$virtualfilterchain.dofilter(filterchainproxy.java:342) @ org.springframework.security.web.access.exceptiontranslationfilter.dofilter(exceptiontranslationfilter.java:113) @ org.springframework.security.web.filterchainproxy$virtualfilterchain.dofilter(filterchainproxy.java:342) @ org.springframework.security.web.session.sessionmanagementfilter.dofilter(sessionmanagementfilter.java:103) @ org.springframework.security.web.filterchainproxy$virtualfilterchain.dofilter(filterchainproxy.java:342) @ org.springframework.security.web.authentication.anonymousauthenticationfilter.dofilter(anonymousauthenticationfilter.java:113) @ org.springframework.security.web.filterchainproxy$virtualfilterchain.dofilter(filterchainproxy.java:342) @ org.springframework.security.web.authentication.rememberme.remembermeauthenticationfilter.dofilter(remembermeauthenticationfilter.java:146) @ org.springframework.security.web.filterchainproxy$virtualfilterchain.dofilter(filterchainproxy.java:342) @ org.springframework.security.web.servletapi.securitycontextholderawarerequestfilter.dofilter(securitycontextholderawarerequestfilter.java:154) @ org.springframework.security.web.filterchainproxy$virtualfilterchain.dofilter(filterchainproxy.java:342) @ org.springframework.security.web.savedrequest.requestcacheawarefilter.dofilter(requestcacheawarefilter.java:45) @ org.springframework.security.web.filterchainproxy$virtualfilterchain.dofilter(filterchainproxy.java:342) @ org.springframework.security.web.authentication.abstractauthenticationprocessingfilter.dofilter(abstractauthenticationprocessingfilter.java:199) @ org.springframework.security.web.filterchainproxy$virtualfilterchain.dofilter(filterchainproxy.java:342) @ org.springframework.security.web.authentication.logout.logoutfilter.dofilter(logoutfilter.java:110) @ org.springframework.security.web.filterchainproxy$virtualfilterchain.dofilter(filterchainproxy.java:342) @ org.springframework.security.web.csrf.csrffilter.dofilterinternal(csrffilter.java:105) @ org.springframework.web.filter.onceperrequestfilter.dofilter(onceperrequestfilter.java:107) @ org.springframework.security.web.filterchainproxy$virtualfilterchain.dofilter(filterchainproxy.java:342) @ org.springframework.security.web.header.headerwriterfilter.dofilterinternal(headerwriterfilter.java:57) @ org.springframework.web.filter.onceperrequestfilter.dofilter(onceperrequestfilter.java:107) @ org.springframework.security.web.filterchainproxy$virtualfilterchain.dofilter(filterchainproxy.java:342) @ org.springframework.security.web.context.securitycontextpersistencefilter.dofilter(securitycontextpersistencefilter.java:87) @ org.springframework.security.web.filterchainproxy$virtualfilterchain.dofilter(filterchainproxy.java:342) @ org.springframework.security.web.context.request.async.webasyncmanagerintegrationfilter.dofilterinternal(webasyncmanagerintegrationfilter.java:50) @ org.springframework.web.filter.onceperrequestfilter.dofilter(onceperrequestfilter.java:107) @ org.springframework.security.web.filterchainproxy$virtualfilterchain.dofilter(filterchainproxy.java:342) @ org.springframework.security.web.filterchainproxy.dofilterinternal(filterchainproxy.java:192) @ org.springframework.security.web.filterchainproxy.dofilter(filterchainproxy.java:160) @ org.springframework.web.filter.delegatingfilterproxy.invokedelegate(delegatingfilterproxy.java:344) @ org.springframework.web.filter.delegatingfilterproxy.dofilter(delegatingfilterproxy.java:261) @ org.eclipse.jetty.servlet.servlethandler$cachedchain.dofilter(servlethandler.java:1652) @ org.eclipse.jetty.servlet.servlethandler.dohandle(servlethandler.java:585) @ org.eclipse.jetty.server.handler.scopedhandler.handle(scopedhandler.java:143) @ org.eclipse.jetty.security.securityhandler.handle(securityhandler.java:550) @ org.eclipse.jetty.server.session.sessionhandler.dohandle(sessionhandler.java:223) @ org.eclipse.jetty.server.handler.contexthandler.dohandle(contexthandler.java:1128) @ org.eclipse.jetty.servlet.servlethandler.doscope(servlethandler.java:515) @ org.eclipse.jetty.server.session.sessionhandler.doscope(sessionhandler.java:185) @ org.eclipse.jetty.server.handler.contexthandler.doscope(contexthandler.java:1062) @ org.eclipse.jetty.server.handler.scopedhandler.handle(scopedhandler.java:141) @ org.eclipse.jetty.server.handler.contexthandlercollection.handle(contexthandlercollection.java:215) @ org.eclipse.jetty.server.handler.handlercollection.handle(handlercollection.java:110) @ org.eclipse.jetty.server.handler.handlerwrapper.handle(handlerwrapper.java:113) @ org.eclipse.jetty.server.server.handle(server.java:507) @ org.eclipse.jetty.server.httpchannel.handle(httpchannel.java:284) @ org.eclipse.jetty.server.httpconnection.onfillable(httpconnection.java:237) @ org.eclipse.jetty.io.abstractconnection$readcallback.succeeded(abstractconnection.java:240) @ org.eclipse.jetty.io.fillinterest.fillable(fillinterest.java:93) @ org.eclipse.jetty.io.selectchannelendpoint$2.run(selectchannelendpoint.java:53) @ org.eclipse.jetty.util.thread.strategy.executeproducerun.produceandrun(executeproducerun.java:191) @ org.eclipse.jetty.util.thread.strategy.executeproducerun.run(executeproducerun.java:126) @ org.eclipse.jetty.util.thread.queuedthreadpool.runjob(queuedthreadpool.java:641) @ org.eclipse.jetty.util.thread.queuedthreadpool$3.run(queuedthreadpool.java:559) @ java.lang.thread.run(thread.java:745)
in stacktrace, there no spring aop class listed between these 2 lines:
@ com.vizaco.onlinecontrol.service.impl.userserviceimpl.saveuser(userserviceimpl.java:51) @ com.vizaco.onlinecontrol.controller.usercontroller.createuser(usercontroller.java:112) your dependency injection not setup right.. controller should getting spring bean of userservice
Comments
Post a Comment