Spring Boot doesn't work with Google App Engine (at least not for me).
However much of the examples written or available in the GitHub or other repositories are using Spring Boot, is there any example for Spring-Data-JPA that does not use Spring Boot and use plain context XML as before?
That will show
You can use Spring Data JPA without Spring Boot (you need to use Spring Core because it is Spring Data JPA dependency), but it doesn't make much sense to me as Spring Boot gives you a lot of convenient magic and syntactic sugar.
Spring Boot Starter Data JPASpring Boot provides starter dependency spring-boot-starter-data-jpa to connect Spring Boot application with relational database efficiently.
Spring data jpa- it is same like jpa means we can describe in below way. Spring Data Jpa is jpa data abstraction access which means it likes a jpa but it add some extra functionality, Without jpa we can not implement the spring data jpa.
No, you cannot perform CRUD operations with JPA alone. As JPA is just a specification, you need the implementation to perform database operations. The implementations are provided by Hibernate, EclipseLink, Ibatis, etc.
Just created this example for you:
src/main/webapp/WEB-INF/spring/context.xml
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p" xmlns:context="http://www.springframework.org/schema/context" xmlns:tx="http://www.springframework.org/schema/tx" xmlns:jpa="http://www.springframework.org/schema/data/jpa" 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.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd http://www.springframework.org/schema/data/jpa http://www.springframework.org/schema/data/jpa/spring-jpa.xsd"> <context:property-placeholder location="/WEB-INF/spring/jdbc.properties" /> <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" p:driverClassName="${jdbc.driverClassName}" p:url="${jdbc.url}" p:username="${jdbc.username}" p:password="${jdbc.password}" /> <bean id="hibernateJpaVendorAdapter" class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter" /> <!-- Configure the entity manager factory bean --> <bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"> <property name="dataSource" ref="dataSource" /> <property name="jpaVendorAdapter" ref="hibernateJpaVendorAdapter" /> <!-- Set JPA properties --> <property name="jpaProperties"> <props> <prop key="hibernate.dialect">${hibernate.dialect}</prop> </props> </property> <property name="packagesToScan" value="com.demo.data" /> </bean> <!-- Configure the transaction manager bean --> <bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager"> <property name="entityManagerFactory" ref="entityManagerFactory" /> </bean> <tx:annotation-driven /> <jpa:repositories base-package="com.demo.data" /> <context:component-scan base-package="com.demo.svc" /> </beans>
/src/main/webapp/WEB-INF/spring/jdbc.properties
# JDBC Connection jdbc.driverClassName=com.mysql.jdbc.Driver jdbc.url=jdbc:mysql://host:3306/db jdbc.username=user jdbc.password=password hibernate.dialect=org.hibernate.dialect.MySQLDialect
/src/main/webapp/WEB-INF/spring/servlet-context.xml
<?xml version="1.0" encoding="UTF-8"?> <beans:beans xmlns="http://www.springframework.org/schema/mvc" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:beans="http://www.springframework.org/schema/beans" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd 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.xsd"> <context:component-scan base-package="com.demo.web" /> </beans:beans>
web.xml
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" version="2.5"> <context-param> <param-name>contextConfigLocation</param-name> <param-value>/WEB-INF/spring/context.xml</param-value> </context-param> <context-param> <param-name>webAppRootKey</param-name> <param-value>demo_jpa</param-value> </context-param> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> <servlet> <servlet-name>appServlet</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <init-param> <param-name>contextConfigLocation</param-name> <param-value>/WEB-INF/spring/servlet-context.xml</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>appServlet</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping> </web-app>
pom.xml
<properties> <org.springframework-version>4.1.7.RELEASE</org.springframework-version> <org.hibernate-em-version>4.3.8.Final</org.hibernate-em-version> <org.springframework.data-version>1.9.0.RELEASE</org.springframework.data-version> <dbcp-version>1.4</dbcp-version> <mysql-connector-version>5.1.28</mysql-connector-version> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> </properties> <dependencies> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context-support</artifactId> <version>${org.springframework-version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>${org.springframework-version}</version> </dependency> <dependency> <groupId>org.springframework.data</groupId> <artifactId>spring-data-jpa</artifactId> <version>${org.springframework.data-version}</version> </dependency> <dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-entitymanager</artifactId> <version>${org.hibernate-em-version}</version> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>${mysql-connector-version}</version> </dependency> <dependency> <groupId>commons-dbcp</groupId> <artifactId>commons-dbcp</artifactId> <version>${dbcp-version}</version> </dependency> </dependencies>
Data Entity: com.demo.data.User
package com.demo.data; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; import javax.persistence.Table; @Entity @Table(name = "SYS_USERS") public class User { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name = "USER_ID") private int id; @Column(name = "USER_NAME") private String name; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } }
Spring Data JPA Repository: com.demo.data.UserRepository
package com.demo.data; import org.springframework.data.repository.CrudRepository; public interface UserRepository extends CrudRepository<User, Integer> { }
Service
Interface:
package com.demo.svc; import com.demo.data.User; public interface UserService { User findUserById(Integer id); }
Implementation:
package com.demo.svc; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import com.demo.data.User; import com.demo.data.UserRepository; @Service public class UserServiceImpl implements UserService { @Autowired UserRepository userRepository; public User findUserById(Integer id) { return userRepository.findOne(id); } }
Web Controller: com.demo.web.UserController
package com.demo.web; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.ResponseBody; import com.demo.svc.UserService; @Controller public class UserController { @Autowired UserService svc; @RequestMapping("/") @ResponseBody public String test() { return svc.findUserById(1).getName(); } }
This is happening because you haven't created the bean of UserRepository in context. There are a number of ways you can do this since you're not using a spring boot project so it won't make an object in the container at startup due to which @Autowired is not injecting the object in the UserRepository class. For this project, you can update the following in your project:
package com.demo.svc; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import com.demo.data.User; import com.demo.data.UserRepository; @Service public class UserServiceImpl implements UserService { UserRepository userRepository; public User findUserById(Integer id) { return userRepository.findOne(id); } public UserRepository setRepo(UserRepository repo) { userRepository=repo; } }
Also, you'll need to inject the object from the container. In src/main/webapp/WEB-INF/spring/context.xml
<bean id="repo" class="com.demo.data.UserRepository"></bean> <!--Setting the object ref in com.demo.svc.UserServiceImpl--> <bean id="userserviceImpl" class="com.demo.svc.UserServiceImpl"> <property name="userRepository" ref="repo"></property> </bean>
Hope it helps
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With