java - Extend a crud-repository interface to handle JPA and mongo entities using spring-data -
i have application uses relational dbs later move on nosql dbs. in case, trying build pojos in such way used both type of dbs (relational , nosql). have next entities defined below.
base class:
package net.breezeware.runway.idm.entity; import java.io.serializable; public abstract class springdatauser implements serializable { /** * */ private static final long serialversionuid = 1l; protected long id; protected string firstname; protected string lastname; protected string middleinitial; protected string email; public long getid() { homecoming id; } public void setid(long id) { this.id = id; } public string getfirstname() { homecoming firstname; } public void setfirstname(string firstname) { this.firstname = firstname; } public string getlastname() { homecoming lastname; } public void setlastname(string lastname) { this.lastname = lastname; } public string getmiddleinitial() { homecoming middleinitial; } public void setmiddleinitial(string middleinitial) { this.middleinitial = middleinitial; } public string getemail() { homecoming email; } public void setemail(string email) { this.email = email; } public string tostring() { stringbuilder sb = new stringbuilder(); sb.append("user ==> "); sb.append("id = " + id + "; "); sb.append("suemail = " + email + "; "); sb.append("lastname = " + lastname + "; "); sb.append("firstname = " + firstname + "; "); sb.append("middleinitial = " + middleinitial); homecoming sb.tostring(); } } jpa class:
package net.breezeware.runway.idm.entity.jpa; import javax.persistence.column; import javax.persistence.entity; import javax.persistence.id; import javax.persistence.table; import javax.xml.bind.annotation.xmlrootelement; import net.breezeware.runway.idm.entity.springdatauser; @xmlrootelement @entity @table(name = "spring_data_user") public class springdatauserjpa extends springdatauser { /** * */ private static final long serialversionuid = 1l; @override @id public long getid() { homecoming id; } @override public void setid(long id) { this.id = id; } @column(name = "last_name") @override public string getlastname() { homecoming lastname; } @override public void setlastname(string lastname) { this.lastname = lastname; } @column(name = "email") @override public string getemail() { homecoming email; } @override public void setemail(string suemail) { this.email = suemail; } @column(name = "first_name") @override public string getfirstname() { homecoming firstname; } @override public void setfirstname(string firstname) { this.firstname = firstname; } @column(name = "middle_initial") @override public string getmiddleinitial() { homecoming middleinitial; } @override public void setmiddleinitial(string middleinitial) { this.middleinitial = middleinitial; } } mongo class:
package net.breezeware.runway.idm.entity.mongo; import net.breezeware.runway.idm.entity.springdatauser; import org.springframework.data.mongodb.core.mapping.document; @document(collection = "spring_data_users") public class springdatausermongo extends springdatauser { /** * */ private static final long serialversionuid = 1l; @override public long getid() { homecoming id; } @override public void setid(long id) { this.id = id; } @override public string getemail() { homecoming email; } @override public void setemail(string email) { this.email = email; } @override public string getlastname() { homecoming lastname; } @override public void setlastname(string lastname) { this.lastname = lastname; } @override public string getfirstname() { homecoming firstname; } @override public void setfirstname(string firstname) { this.firstname = firstname; } @override public string getmiddleinitial() { homecoming middleinitial; } @override public void setmiddleinitial(string middleinitial) { this.middleinitial = middleinitial; } } i planning build dao access records using these entities. define generic dao , extend different storage types shown below.
generic dao:
package net.breezeware.runway.idm.dao; import java.util.list; import org.springframework.data.repository.norepositorybean; import org.springframework.data.repository.pagingandsortingrepository; @norepositorybean public interface springdatauserrepository<springdatauser> extends pagingandsortingrepository<springdatauser, long> { list<springdatauser> findbyemail(string email); list<springdatauser> findbylastname(string lastname); } jpa dao:
bundle net.breezeware.runway.idm.dao.jpa; import net.breezeware.runway.idm.dao.springdatauserrepository; import net.breezeware.runway.idm.entity.jpa.springdatauserjpa; import org.springframework.context.annotation.profile; import org.springframework.stereotype.repository; @repository @profile("jpa") public interface springdatauserjparepository extends springdatauserrepository<springdatauserjpa> { } mongo dao:
package net.breezeware.runway.idm.dao.mongo; import net.breezeware.runway.idm.dao.springdatauserrepository; import net.breezeware.runway.idm.entity.mongo.springdatausermongo; import org.springframework.context.annotation.profile; import org.springframework.stereotype.repository; @repository @profile("mongo") public interface springdatausermongorepository extends springdatauserrepository<springdatausermongo> { } as have noticed, trying help spring-data's automatic dao implementation generation feature defined below.
application context file:
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:context="http://www.springframework.org/schema/context" xmlns:jpa="http://www.springframework.org/schema/data/jpa" xmlns:mongo="http://www.springframework.org/schema/data/mongo" xmlns:tx="http://www.springframework.org/schema/tx" xmlns:xsi="http://www.w3.org/2001/xmlschema-instance" xmlns:util="http://www.springframework.org/schema/util" xmlns:jdbc="http://www.springframework.org/schema/jdbc" xsi:schemalocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd http://www.springframework.org/schema/jdbc http://www.springframework.org/schema/jdbc/spring-jdbc-3.0.xsd http://www.springframework.org/schema/data/mongo http://www.springframework.org/schema/data/mongo/spring-mongo.xsd http://www.springframework.org/schema/data/jpa http://www.springframework.org/schema/data/jpa/spring-jpa.xsd"> <!-- load property files required in app. files prefix 'override' used set properties based on environment. --> <context:property-placeholder location="classpath:runway.properties" /> <bean id="tejascarestationprops" class="org.springframework.beans.factory.config.propertiesfactorybean"> <property name="locations"> <list> <value>classpath:conf/runwayidm.properties</value> </list> </property> </bean> <context:annotation-config /> <context:component-scan base-package="net.breezeware" /> <tx:annotation-driven /> <!-- note: jndi not used set db properties. 'jdbc/alstomdatasource can set in context.xml file tomcat's 'conf' directory. done exercise see if works! --> <!-- <jee:jndi-lookup id="runwaydatasource" jndi-name="jdbc/alstomdatasource" expected-type="javax.sql.datasource" /> --> <bean id="runwaydatasource" class="org.apache.commons.dbcp.basicdatasource" destroy-method="close"> <property name="driverclassname" value="${database.driverclassname}" /> <property name="url" value="${database.url}" /> <property name="username" value="${database.username}" /> <property name="password" value="${database.password}" /> </bean> <bean class="org.springframework.orm.jpa.jpatransactionmanager" id="transactionmanager"> <property name="entitymanagerfactory" ref="entitymanagerfactory" /> </bean> <bean id="entitymanagerfactory" class="org.springframework.orm.jpa.localcontainerentitymanagerfactorybean"> <property name="datasource" ref="runwaydatasource" /> <property name="packagestoscan"> <list> <!-- fixme: having top level & wild cards in bundle value not work. --> <!-- <value>net.breezeware.alstom.groupcontrol</value> --> <value>net.breezeware</value> </list> </property> <property name="jpavendoradapter"> <bean class="org.springframework.orm.jpa.vendor.hibernatejpavendoradapter"> <property name="showsql" value="true" /> <property name="databaseplatform" value="${hibernate.dialectclass}" /> </bean> </property> <property name="jpaproperties"> <props> <prop key="hibernate.hbm2ddl.auto">update</prop> <prop key="hibernate.show_sql">true</prop> </props> </property> </bean> <jpa:repositories base-package="net.breezeware" entity-manager-factory-ref="entitymanagerfactory"/> <!-- ######################### mongo db ######################### --> <mongo:mongo host="${mongodb.host}" port="${mongodb.port}" /> <mongo:db-factory id="mongodbfactory" host="${mongodb.host}" port="${mongodb.port}" dbname="${mongodb.dbname}" username="${mongodb.username}" password="${mongodb.password}" /> <bean id="mongotemplate" class="org.springframework.data.mongodb.core.mongotemplate"> <constructor-arg name="mongodbfactory" ref="mongodbfactory" /> </bean> i have included service class uses dao access stores:
package net.breezeware.runway.idm.service.impl; import java.util.list; import net.breezeware.runway.idm.dao.springdatauserrepository; import net.breezeware.runway.idm.entity.springdatauser; import net.breezeware.runway.idm.service.api.idmservice; import org.slf4j.logger; import org.slf4j.loggerfactory; import org.springframework.beans.factory.annotation.autowired; import org.springframework.stereotype.service; import org.springframework.transaction.annotation.transactional; @service public class idmserviceimpl implements idmservice { @autowired springdatauserrepository<springdatauser> springdatauserrepository; @transactional public springdatauser savespringdatauser(springdatauser user) { // homecoming springdatauserrepository.save(user); homecoming null; } @transactional public list<springdatauser> findspringdatausersbylastname(string lastname) { homecoming springdatauserrepository.findbylastname(lastname); } @transactional public list<springdatauser> findallspringdatausers() { homecoming (list<springdatauser>) springdatauserrepository.findall(); } } i have next application file serves entry point app:
package net.breezeware.runway.idm; import org.slf4j.logger; import org.slf4j.loggerfactory; import org.springframework.boot.springapplication; import org.springframework.boot.autoconfigure.enableautoconfiguration; import org.springframework.context.annotation.componentscan; import org.springframework.context.annotation.configuration; import org.springframework.context.annotation.importresource; @configuration @importresource(value = {"classpath:applicationcontext.xml"}) @enableautoconfiguration @componentscan public class idmapplication { public static void main(string[] args) throws exception { logger logger = loggerfactory.getlogger(idmapplication.class); springapplication.run(idmapplication.class, args); logger.info("inside main method of idmapplication"); } } here code have test service functionality.
package net.breezeware.runway.idm; import net.breezeware.runway.idm.entity.springdatauser; import net.breezeware.runway.idm.entity.jpa.springdatauserjpa; import net.breezeware.runway.idm.service.api.idmservice; import org.slf4j.logger; import org.slf4j.loggerfactory; import org.springframework.beans.factory.annotation.autowired; import org.springframework.boot.test.springapplicationconfiguration; import org.springframework.test.context.activeprofiles; import org.springframework.test.context.testng.abstracttestngspringcontexttests; import org.testng.annotations.test; //@contextconfiguration({"classpath:**/applicationcontext.xml"}) // @enableautoconfiguration // @componentscan @activeprofiles(profiles = {"jpa"}) // @webappconfiguration @springapplicationconfiguration(classes = idmapplication.class) public class idmservicesjpatest extends abstracttestngspringcontexttests { logger logger = loggerfactory.getlogger(idmservicesjpatest.class); @autowired private idmservice idmservice; @test public void createspringdatausertest() { logger.info("========== createspringdatausertest() =========="); springdatauser user = new springdatauserjpa(); seek { user.setid(1); user.setemail("mark@gmail.com"); user.setfirstname("mark"); user.setlastname("adams"); user.setmiddleinitial(""); logger.info("springdatauser saved = " + user); springdatauser saveduser = idmservice.savespringdatauser(user); logger.info("saved user = " + saveduser); } grab (exception e) { logger.info("exception occured = " + e); } } } i utilize 'profile' feature in spring take dao implementation in run-time. expect code work, unfortunately have problem getting dao interfaces autowired service classes. seems dao/repository implementations springdatauserrepository not not created spring-data. here error in log file when seek run test.
@ org.testng.suiterunner.privaterun(suiterunner.java:291) @ org.testng.suiterunner.run(suiterunner.java:240) @ org.testng.suiterunnerworker.runsuite(suiterunnerworker.java:52) @ org.testng.suiterunnerworker.run(suiterunnerworker.java:86) @ org.testng.testng.runsuitessequentially(testng.java:1224) @ org.testng.testng.runsuiteslocally(testng.java:1149) @ org.testng.testng.run(testng.java:1057) @ org.apache.maven.surefire.testng.testngexecutor.run(testngexecutor.java:70) @ org.apache.maven.surefire.testng.testngdirectorytestsuite.execute(testngdirectorytestsuite.java:109) @ org.apache.maven.surefire.testng.testngprovider.invoke(testngprovider.java:111) @ sun.reflect.nativemethodaccessorimpl.invoke0(native method) @ sun.reflect.nativemethodaccessorimpl.invoke(nativemethodaccessorimpl.java:57) @ sun.reflect.delegatingmethodaccessorimpl.invoke(delegatingmethodaccessorimpl.java:43) @ java.lang.reflect.method.invoke(method.java:601) @ org.apache.maven.surefire.util.reflectionutils.invokemethodwitharray(reflectionutils.java:164) @ org.apache.maven.surefire.booter.providerfactory$providerproxy.invoke(providerfactory.java:110) @ org.apache.maven.surefire.booter.surefirestarter.invokeprovider(surefirestarter.java:175) @ org.apache.maven.surefire.booter.surefirestarter.runsuitesinprocesswhenforked(surefirestarter.java:107) @ org.apache.maven.surefire.booter.forkedbooter.main(forkedbooter.java:68) caused by: org.springframework.beans.factory.beancreationexception: error creating bean name 'idmserviceimpl': injection of autowired dependencies failed; nested exception org.springframework.beans.factory.beancreationexception: not autowire field: net.breezeware.runway.idm.dao.springdatauserrepository net.breezeware.runway.idm.service.impl.idmserviceimpl.springdatauserrepository; nested exception org.springframework.beans.factory.nosuchbeandefinitionexception: no qualifying bean of type [net.breezeware.runway.idm.dao.springdatauserrepository] found dependency: expected @ to the lowest degree 1 bean qualifies autowire candidate dependency. dependency annotations: {@org.springframework.beans.factory.annotation.autowired(required=true)} @ org.springframework.beans.factory.annotation.autowiredannotationbeanpostprocessor.postprocesspropertyvalues(autowiredannotationbeanpostprocessor.java:292) @ org.springframework.beans.factory.support.abstractautowirecapablebeanfactory.populatebean(abstractautowirecapablebeanfactory.java:1185) @ org.springframework.beans.factory.support.abstractautowirecapablebeanfactory.docreatebean(abstractautowirecapablebeanfactory.java:537) @ org.springframework.beans.factory.support.abstractautowirecapablebeanfactory.createbean(abstractautowirecapablebeanfactory.java:475) @ org.springframework.beans.factory.support.abstractbeanfactory$1.getobject(abstractbeanfactory.java:304) @ org.springframework.beans.factory.support.defaultsingletonbeanregistry.getsingleton(defaultsingletonbeanregistry.java:228) @ org.springframework.beans.factory.support.abstractbeanfactory.dogetbean(abstractbeanfactory.java:300) @ org.springframework.beans.factory.support.abstractbeanfactory.getbean(abstractbeanfactory.java:195) @ org.springframework.beans.factory.support.defaultlistablebeanfactory.preinstantiatesingletons(defaultlistablebeanfactory.java:700) @ org.springframework.context.support.abstractapplicationcontext.finishbeanfactoryinitialization(abstractapplicationcontext.java:760) @ org.springframework.context.support.abstractapplicationcontext.refresh(abstractapplicationcontext.java:482) @ org.springframework.boot.springapplication.refresh(springapplication.java:691) @ org.springframework.boot.springapplication.run(springapplication.java:320) @ org.springframework.boot.test.springapplicationcontextloader.loadcontext(springapplicationcontextloader.java:107) @ org.springframework.test.context.cacheawarecontextloaderdelegate.loadcontextinternal(cacheawarecontextloaderdelegate.java:64) @ org.springframework.test.context.cacheawarecontextloaderdelegate.loadcontext(cacheawarecontextloaderdelegate.java:91) ... 38 more caused by: org.springframework.beans.factory.beancreationexception: not autowire field: net.breezeware.runway.idm.dao.springdatauserrepository net.breezeware.runway.idm.service.impl.idmserviceimpl.springdatauserrepository; nested exception org.springframework.beans.factory.nosuchbeandefinitionexception: no qualifying bean of type [net.breezeware.runway.idm.dao.springdatauserrepository] found dependency: expected @ to the lowest degree 1 bean qualifies autowire candidate dependency. dependency annotations: {@org.springframework.beans.factory.annotation.autowired(required=true)} @ org.springframework.beans.factory.annotation.autowiredannotationbeanpostprocessor$autowiredfieldelement.inject(autowiredannotationbeanpostprocessor.java:508) @ org.springframework.beans.factory.annotation.injectionmetadata.inject(injectionmetadata.java:87) @ org.springframework.beans.factory.annotation.autowiredannotationbeanpostprocessor.postprocesspropertyvalues(autowiredannotationbeanpostprocessor.java:289) ... 53 more caused by: org.springframework.beans.factory.nosuchbeandefinitionexception: no qualifying bean of type [net.breezeware.runway.idm.dao.springdatauserrepository] found dependency: expected @ to the lowest degree 1 bean qualifies autowire candidate dependency. dependency annotations: {@org.springframework.beans.factory.annotation.autowired(required=true)} @ org.springframework.beans.factory.support.defaultlistablebeanfactory.raisenosuchbeandefinitionexception(defaultlistablebeanfactory.java:1100) @ org.springframework.beans.factory.support.defaultlistablebeanfactory.doresolvedependency(defaultlistablebeanfactory.java:960) @ org.springframework.beans.factory.support.defaultlistablebeanfactory.resolvedependency(defaultlistablebeanfactory.java:855) @ org.springframework.beans.factory.annotation.autowiredannotationbeanpostprocessor$autowiredfieldelement.inject(autowiredannotationbeanpostprocessor.java:480) ... 55 more not daos instantiated/autowired service class. have tried different settings marking base of operations entity object 'springdatauser' @markedsuperclass , such, nil seems work. please allow me know if missing something. have spent considerable amount of time on stackoverflow find reply not find 1 solves problem. thanks in advances.
java mongodb jpa spring-data repository
No comments:
Post a Comment