I am implementing Spring Data with Redis cache, MySQL, JPA Hibernate CRUD API . Caching is not working for controllers I used and not reflecting but for GetMapping and PostMapping it's working because I am not using any cache configuration, but the other three controllers which I configured with cache, I get connection refused. I didn't install any Redis cache in local. Is it required to install Redis cache for this because I'm using Redis for cache.
Controller
package com.example.redis.springbootrediscache.controller;
import com.example.redis.springbootrediscache.ResouceNotFoundException;
import com.example.redis.springbootrediscache.model.Employee;
import com.example.redis.springbootrediscache.repository.EmployeeRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cache.annotation.CacheEvict;
import org.springframework.cache.annotation.CachePut;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import java.util.List;
@RestController
@RequestMapping("/api")
public class EmployeeController {
@Autowired
private EmployeeRepository employeeRepository;
@PostMapping("/employees")
public Employee addEmployee(@RequestBody Employee employee) {
return employeeRepository.save(employee);
}
@GetMapping("/employees")
public ResponseEntity<List<Employee>> getAllEmployees() {
return ResponseEntity.ok(employeeRepository.findAll());
}
@GetMapping("employees/{employeeId}")
@Cacheable(value = "employees",key = "#employeeId")
public Employee findEmployeeById(@PathVariable(value = "employeeId") Integer employeeId) {
System.out.println("Employee fetching from database:: "+employeeId);
return employeeRepository.findById(employeeId).orElseThrow(
() -> new ResouceNotFoundException("Employee not found" + employeeId));
}
@PutMapping("employees/{employeeId}")
@CachePut(value = "employees",key = "#employeeId")
public Employee updateEmployee(@PathVariable(value = "employeeId") Integer employeeId,
@RequestBody Employee employeeDetails) {
Employee employee = employeeRepository.findById(employeeId)
.orElseThrow(() -> new ResouceNotFoundException("Employee not found for this id :: " + employeeId));
employee.setName(employeeDetails.getName());
final Employee updatedEmployee = employeeRepository.save(employee);
return updatedEmployee;
}
@DeleteMapping("employees/{id}")
@CacheEvict(value = "employees", allEntries = true)
public void deleteEmployee(@PathVariable(value = "id") Integer employeeId) {
Employee employee = employeeRepository.findById(employeeId).orElseThrow(
() -> new ResouceNotFoundException("Employee not found" + employeeId));
employeeRepository.delete(employee);
}
}
Employee
package com.example.redis.springbootrediscache.model;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import java.io.Serializable;
@Data
@AllArgsConstructor
@NoArgsConstructor
@Entity
public class Employee implements Serializable {
@Id
@GeneratedValue
private int id;
private String name;
}
SpringBootApplication
package com.example.redis.springbootrediscache;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cache.annotation.EnableCaching;
@SpringBootApplication
@EnableCaching
public class SpringbootRedisCacheApplication {
public static void main(String[] args) {
SpringApplication.run(SpringbootRedisCacheApplication.class, args);
}
}
application.yaml
spring:
cache:
type: redis
redis:
time-to-live: 60000
cache-null-values: true
datasource:
driver-class-name: org.postgresql.Driver
url: jdbc:postgresql://localhost:5432/TradeX
username: postgres
password: admin
hikari:
initialization-fail-timeout: 0
jpa:
database-platform: org.hibernate.dialect.PostgreSQLDialect
generate-ddl: true
show-sql: true
hibernate:
ddl-auto: create
server:
port: 8087
pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.3.1.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.example.redis</groupId>
<artifactId>springboot-redis-cache</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>springboot-redis-cache</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>org.postgresql</groupId>
<artifactId>postgresql</artifactId>
<version>42.5.0</version>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>io.projectreactor</groupId>
<artifactId>reactor-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>