Purab’s IntelliJ IDEA File and Code Templates for Productive SpringBoot development

For devlopment I am using Intellij IDE. I found “File and Code Templates” and “Live Templates” very useful, It is beneficial while doing day-to-day development. It saves some time and be more productive.

github link: https://github.com/purab/IntelliJ-IDEA-File-Templates

Mostly we work on Rest APIs. So I created the following File Templates

  1. Spring Controller
  2. Spring Entity
  3. Spring Repository
  4. Spring Service
  5. Spring Static Service

Go to file-> setting and search for “File Templates”. 

Spring Controller

  • On Files tab click on + (Create Template)
  • Enter Name as : “SpringController”, and leave Extension as java
  • In the Content text box add the following content
#if (${PACKAGE_NAME} && ${PACKAGE_NAME} != "")package ${PACKAGE_NAME};#end
#set( $CamelCaseName = "$NAME.substring(0,1).toLowerCase()$NAME.substring(1)" )

import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;

import org.springframework.web.bind.annotation.*;

@CrossOrigin
@RestController
@RequestMapping("/api")
@RequiredArgsConstructor
@Slf4j
public class ${NAME}Controller {
	
	@GetMapping("/${CamelCaseName}s")
	public List<${NAME}> getAll${NAME}s() {
		return ${NAME}Service.getAll${NAME}s();
	}
	
	@GetMapping("/${CamelCaseName}/{${CamelCaseName}Id}")
	public ${NAME} get${NAME}Details(@PathVariable Long ${CamelCaseName}Id) {
		return ${NAME}Service.get${NAME}Details(${CamelCaseName}Id);
	}

	@PostMapping("/add${NAME}")
	public ${NAME} add${NAME}(@RequestBody ${NAME} ${CamelCaseName}) {
		return ${NAME}Service.add${NAME}(${CamelCaseName});
	}
	
	@PutMapping("/update${NAME}/{${CamelCaseName}Id}")
	public ${NAME} update${NAME}(@PathVariable Long ${CamelCaseName}Id, @RequestBody ${NAME} ${CamelCaseName}) {
		return ${NAME}Service.update${NAME}(${CamelCaseName}Id, ${CamelCaseName});
	}
	
	@DeleteMapping("/delete${NAME}/{${CamelCaseName}Id}")
	public ${NAME} delete${NAME}(@PathVariable Long ${CamelCaseName}Id) {

		return ${NAME}Service.delete${NAME}(${CamelCaseName}Id);
	}
}
  • Click Ok Button

Spring Entity

  • On Files tab click on + (Create Template)
  • Enter Name as : “SpringController”, and leave Extension as java
  • In the Content text box add the following content
#if (${PACKAGE_NAME} && ${PACKAGE_NAME} != "")package ${PACKAGE_NAME};#end

import lombok.Getter;
import lombok.Setter;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;

@Setter
@Getter
@NoArgsConstructor
@AllArgsConstructor
@Entity
@Table(name = "${NAME}")
public class ${NAME} {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String name;
	
	public ${NAME}() {}
	
	public ${NAME}(Long id, String name) {		
		this.id = id;
		this.name = name;		
	}

}
  • Click Ok Button

Spring Repository

  • On Files tab click on + (Create Template)
  • Enter Name as : “SpringController”, and leave Extension as java
  • In the Content text box add the following content
#if (${PACKAGE_NAME} && ${PACKAGE_NAME} != "")package ${PACKAGE_NAME};#end
#set ($index = $NAME.indexOf('Repository'))
#set ($ENTITY= $NAME.substring(0, $index))

import org.springframework.data.jpa.repository.JpaRepository;

public interface ${NAME} extends JpaRepository<$ENTITY, Long> {
}
  • Click Ok Button

Spring Service

  • On Files tab click on + (Create Template)
  • Enter Name as : “SpringController”, and leave Extension as java
  • In the Content text box add the following content
#if (${PACKAGE_NAME} && ${PACKAGE_NAME} != "")package ${PACKAGE_NAME};#end
#set( $CamelCaseName = "$NAME.substring(0,1).toLowerCase()$NAME.substring(1)" )

import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import java.util.List;
import java.util.Optional;

import javax.management.RuntimeErrorException;

import org.springframework.transaction.annotation.Transactional;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Sort;

import org.springframework.stereotype.Service;
import ${PACKAGE_NAME}.repositories.${NAME}Repository;

@Service
@Transactional
@RequiredArgsConstructor
public class ${Name}Service{

	@Autowired
	private ${Name}Repository ${CamelCaseName}Repository;
	
	
	public List<${Name}> getAll${Name}s() {
		return ${CamelCaseName}Repository.findAll();
	}

	
	public void save${Name}(${Name} ${CamelCaseName}) {		
		this.${CamelCaseName}Repository.save(${CamelCaseName});
		
	}

	
	public ${Name} get${Name}ById(long id) {
		Optional<${Name}> optional = ${CamelCaseName}Repository.findById(id);
		${Name} ${CamelCaseName} = null;
		if(optional.isPresent()) {
			${CamelCaseName} = optional.get();
		} else {
			throw new RuntimeException("${CamelCaseName} not found for id:"+id);
		}
		return ${CamelCaseName};
			
	}

	
	public void delete${Name}ById(long id) {
		this.${CamelCaseName}Repository.deleteById(id);		
	}

	
	public Page<${Name}> findPaginated(int pageNo, int pageSize, String sortField, String sortDirection) {
		Sort sort = sortDirection.equalsIgnoreCase(Sort.Direction.ASC.name()) ? Sort.by(sortField).ascending() :
			Sort.by(sortField).descending();
		
		Pageable pageable = PageRequest.of(pageNo -1,pageSize);
		return this.${CamelCaseName}Repository.findAll(pageable);

	}
	
	public static ${NAME} update${NAME}(Long ${CamelCaseName}Id, ${NAME} ${CamelCaseName}) {
	
		${NAME} ${CamelCaseName} = ${CamelCaseName}Repository.findById(${CamelCaseName}Id)
                .orElseThrow(() -> new ResourceNotFoundException("${NAME} not found for this id :: " + ${CamelCaseName}Id));
	
		${CamelCaseName}.setId(${CamelCaseName}Id);
		this.${CamelCaseName}Repository.save(${CamelCaseName})
		return ${CamelCaseName};
	}
	

}
  • Click Ok Button

Spring Static Service

  • On Files tab click on + (Create Template)
  • Enter Name as : “SpringController”, and leave Extension as java
  • In the Content text box add the following content
#if (${PACKAGE_NAME} && ${PACKAGE_NAME} != "")package ${PACKAGE_NAME};#end
#set( $CamelCaseName = "$NAME.substring(0,1).toLowerCase()$NAME.substring(1)" )

import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;

import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import ${PACKAGE_NAME}.repositories.${NAME}Repository;

@Service
@Transactional
@RequiredArgsConstructor
@Slf4j
public class ${NAME}Service {
    private final ${NAME}Repository ${CamelCaseName}Repository;
	
	
	private static Map ${CamelCaseName}s =  new HashMap<>();
	
	private static Long index=2L;
	
	static {
			${NAME} ${CamelCaseName}01 = new ${NAME}(1L, "${CamelCaseName}1");
			${NAME} ${CamelCaseName}02 = new ${NAME}(2L, "${CamelCaseName}2");
			${CamelCaseName}s.put(1L,${CamelCaseName}01);
			${CamelCaseName}s.put(2L,${CamelCaseName}02);
	};
	
	public static List<${NAME}> getAll${NAME}s() {
		return new ArrayList<>(${CamelCaseName}s.values());
	}
	
	public static ${NAME} get${NAME}Details(Long ${CamelCaseName}Id) {
		return ${CamelCaseName}s.get(${CamelCaseName}Id);
	}
	
	public static ${NAME} add${NAME}(${NAME} ${CamelCaseName}) {
		index +=1;
		${CamelCaseName}.setId(index);
		${CamelCaseName}s.put(index, ${CamelCaseName});
		return ${CamelCaseName};
	}
	
	public static ${NAME} update${NAME}(Long ${CamelCaseName}Id, ${NAME} ${CamelCaseName}) {
		${CamelCaseName}.setId(${CamelCaseName}Id);
		${CamelCaseName}s.put(${CamelCaseName}Id, ${CamelCaseName});
		return ${CamelCaseName};
	}
	
	public static ${NAME} delete${NAME}(Long ${CamelCaseName}Id) {
		return ${CamelCaseName}s.remove(${CamelCaseName}Id);
	}
    
}
  • Click Ok Button

SSL certificate integration in Spring boot Project

SSL certificate integration

SSL certificate setting applied in application.properties file To generate self signed SSL certificate use following command:

cd src/main/resources
keytool -genkeypair -alias local_ssl -keyalg RSA -keysize 2048 -storetype PKCS12 -keystore local-ssl.p12 -validity 365 -ext san=dns:localhost

Put following code into application.properties file

spring.application.name=ssl-certificate
server.port=8443
#server.port=8080
server.ssl.enabled: true
server.ssl.key-alias: local_ssl
server.ssl.key-store: classpath:local-ssl.p12
server.ssl.key-store-type: PKCS12
server.ssl.key-password: 12345678
server.ssl.key-store-password: 12345678

Open this URL:
https://localhost:8443/

For production use following command and use p12 file in application Convert .crt to .p12

openssl pkcs12 -export -out server.p12 -inkey server.key -in server.crt

Where server.key , is the server key . server.crt is cert file from CA or self sign

you can find source code here:

https://github.com/purab/ssl-certificate-spring-boot

java error invalid source release 15 in intellij Idea Solved error

While the spring boot project was running project in IntelliJ idea I got the following error:

language level is invalid or missing in pom.xml. current project jdk is 15

and this also;

java error invalid source release 15

This issue will occur when you have two or more java versions installed in machine.

I did the following to solve the issue:

Go to File->Project Setting and check “Project SDK” and “Project Language Level”

Then go to Modules and select the same version as the JAVA version.

This setting will solve your issue.