Creating Custom SpringBoot Starter for Twitter4j

SpringBoot provides lot of starter modules to get up and running quickly. SpringBoot’s auto-configure mechanism takes care of configuring SpringBeans on our behalf based on various criteria. In addition to the springboot starters that comes out-of-the-box provided by Core Spring Team, we can also create our own starter modules. In this post we will look into how to create a custom SpringBoot starter. To demonstrate it we are going to create twitter4j-spring-boot-starter which will auto-configure Twitter4J beans. To accomplish this, we are going to create:  twitter4j-spring-boot-autoconfigure module which contains Twitter4J AutoConfiguration bean definitions  twitter4j-spring-boot-starter module which pulls in twitter4j-spring-boot-autoconfigure and

Continue reading »

SpringBoot : Working with JOOQ

In my previous article SpringBoot : Working with MyBatis  we have learned how to use SpringBoot MyBatis Starter to quickly get up and running with Spring and MyBatis. In this article we are going to learn about how to use SpringBoot JOOQ Starter. JOOQ (Java Object Oriented Querying) is a persistence framework which embraces SQL. JOOQ provides the following features: Building Typesafe SQL using DSL API  Typesafe database object referencing using Code Generation  Easy to use API for Querying and Data fetching  SQL logging and debugging etc etc  SpringBoot provides a starter, spring-boot-starter-jooq, to be able to quickly integrate with

Continue reading »

SpringBoot : Working with MyBatis

MyBatis is a SQL Mapping framework with support for custom SQL, stored procedures and advanced mappings. SpringBoot doesn’t provide official support for MyBatis integration, but MyBatis community built a SpringBoot starter for MyBatis.  You can read about the SpringBoot MyBatis Starter release announcement at http://blog.mybatis.org/2015/11/mybatis-spring-boot-released.html and you can explore the source code on GitHub https://github.com/mybatis/mybatis-spring-boot. Create a SpringBoot Maven project and add the following MyBatis Starter dependency. <dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <version>1.0.0</version> </dependency> We will be reusing User.java, schema.sql and data.sql files created in my previous article SpringBoot : Working with JdbcTemplate Create MyBatis SQL Mapper interface UserMapper.java with few database

Continue reading »

SpringBoot : Working with JdbcTemplate

Spring provides a nice abstraction on top of JDBC API using JdbcTemplate and also provides great transaction management capabilities using annotation based approach. First let’s take a quick look at how we generally use Spring’s JdbcTemplate (without SpringBoot) by registering DataSource, TransactionManager and JdbcTemplate beans and optionally we can register DataSourceInitializer bean to initialize our database. @Configuration @ComponentScan @EnableTransactionManagement @PropertySource(value = { “classpath:application.properties” }) public class AppConfig { @Autowired private Environment env; @Value(“${init-db:false}”) private String initDatabase; @Bean public static PropertySourcesPlaceholderConfigurer placeHolderConfigurer() { return new PropertySourcesPlaceholderConfigurer(); } @Bean public JdbcTemplate jdbcTemplate(DataSource dataSource) { return new JdbcTemplate(dataSource); } @Bean public PlatformTransactionManager transactionManager(DataSource

Continue reading »

How SpringBoot AutoConfiguration magic works?

In my previous post Why SpringBoot? we have looked at how to create a SpringBoot application. But you may or may not understand what is going on behind the scenes. You may want to understand the magic behind the SpringBoot’s AutoConfiguration. But before that you should know about Spring’s @Conditional feature based on which all the SpringBoot’s AutoConfiguration magic depends. Exploring the power of @Conditional  While developing Spring based applications we may come across of a need to register beans conditionally. For example, you may want to register a DataSource bean pointing to DEV Database while running application locally and

Continue reading »

Why SpringBoot?

Spring is a very popular Java based framework for building web and enterprise applications. Unlike many other frameworks which focuses on only one area, Spring framework provides a wide verity of features addressing the modern business needs via its portfolio projects. Spring framework provides flexibility to configure the beans in multiple ways such as XML, Annotations and JavaConfig. With the number of features increased the complexity also gets increased and configuring Spring applications becomes tedious and error-prone. Spring team created SpringBoot to address the complexity of configuration. But before diving into SpringBoot, we will take a quick look at Spring framework

Continue reading »

Retrying Method Execution using Spring AOP

One of my blog follower sends an email asking me to show an example of “RealWorld Usage of Spring AOP”. He mentioned that in most of the examples the usage of Spring AOP is demonstrated for logging method entry/exit or Transaction management or Security checks. He wanted to know how Spring AOP is being used in “Real Project for Real Problems”. So I would like to show how I have used Spring AOP for one of my project to handle a real problem. We won’t face some kind of problems in development phases and only come to know during Load Testing or

Continue reading »

JCart : Iteration-8

In this Iteration#8 we will implement showing the Customer Account and Order History functionality in our ShoppingCart application. Customer MyAccount Page Profile Order History Once the customer is logged in our system he can click on MyAccount link at the top of the header and view his profile details and order history. First let us write the Controller handler method in our CustomerController to show myAccount details. @Controller public class CustomerController extends JCartSiteBaseController { @Autowired private CustomerService customerService; … … @RequestMapping(value=”/myAccount”, method=RequestMethod.GET) protected String myAccount(Model model) { String email = getCurrentUser().getCustomer().getEmail(); Customer customer = customerService.getCustomerByEmail(email); model.addAttribute(“customer”, customer); List<Order> orders =

Continue reading »

JCart : Manage Customers

For Managing Customers we need a provision to see all the list of customers and view any Customers details. Let us start with implementing the back-end Customer service. public interface CustomerRepository extends JpaRepository<Customer, Integer> { Customer findByEmail(String email); @Query(“select o from Order o where o.customer.email=?1”) List<Order> getCustomerOrders(String email); } @Service @Transactional public class CustomerService { @Autowired CustomerRepository customerRepository; public Customer getCustomerByEmail(String email) { return customerRepository.findByEmail(email); } public Customer createCustomer(Customer customer) { return customerRepository.save(customer); } public List<Customer> getAllCustomers() { return customerRepository.findAll(); } public Customer getCustomerById(Integer id) { return customerRepository.findOne(id); } public List<Order> getCustomerOrders(String email) { return customerRepository.getCustomerOrders(email); } } Now let

Continue reading »

JCart : Manage Orders

For Managing Orders we need a provision to see all the list of orders and view an order details and updating the order status. Let us start with implementing the back-end order service. @Service @Transactional public class OrderService { @Autowired EmailService emailService; @Autowired OrderRepository orderRepository; … … public Order getOrder(String orderNumber) { return orderRepository.findByOrderNumber(orderNumber); } public List<Order> getAllOrders() { Sort sort = new Sort(Direction.DESC, “createdOn”); return orderRepository.findAll(sort); } public Order updateOrder(Order order) { Order o = getOrder(order.getOrderNumber()); o.setStatus(order.getStatus()); Order savedOrder = orderRepository.save(o); return savedOrder; } } Now let us implement OrderController to handle the requests to display list of orders,

Continue reading »