Spring Boot - DataRest RESTful MVC Thymeleaf. Extrabonus (Actuator y Remote Shell)

- Prerequisitos

Genera tu proyecto con Spring Boot Initializr.

- spring-boot-starter-data-jpa

- spring-boot-starter-data-rest

- spring-boot-starter-thymeleaf

- h2

- spring-boot-starter-actuator

- spring-boot-starter-remote-shell

 

1. Configuración Maven.

<groupId>com.ledzedev.springboot.datarest</groupId>
<artifactId>ledzedev-springboot-datarest-restfull-mvc-thymeleaf</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>

<name>ledzedev-springboot-datarest-restfull-mvc-thymeleaf</name>
<description>Demo project for Spring Boot</description>

<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.4.2.RELEASE</version>
</parent>

<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
</properties>

<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-rest</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>

<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-remote-shell</artifactId>
</dependency>
</dependencies>

2. Entidad para escribir en BD.

/**
* Código generado por Gerado Pucheta Figueroa
* Twitter: @ledzedev
* http://ledze.mx
* 14/Nov/2016.
*/
@Entity
class CuentaBancaria {


@Id
@GeneratedValue
private Long id;


private String titularCuenta;

private String saldoDisponible;

public CuentaBancaria(String titularCuenta, String saldoDisponible) {
this.titularCuenta = titularCuenta;
this.saldoDisponible = saldoDisponible;
}

public CuentaBancaria() {//JPA requiere constructor vacío y nadie sabe por que???
}


public Long getId() {
return id;
}

public void setId(Long id) {
this.id = id;
}

public String getTitularCuenta() {
return titularCuenta;
}

public void setTitularCuenta(String titularCuenta) {
this.titularCuenta = titularCuenta;
}

public String getSaldoDisponible() {
return saldoDisponible;
}

public void setSaldoDisponible(String saldoDisponible) {
this.saldoDisponible = saldoDisponible;
}

@Override
public String toString() {

return "CuentaBancaria{" +
"id=" + id +
", titularCuenta='" + titularCuenta + '\'' +
", saldoDisponible=" + saldoDisponible +
'}';
}
}

 

3. Interfaz que hable con la BD.

/**
* Código generado por Gerado Pucheta Figueroa
* Twitter: @ledzedev
* http://ledze.mx
* 14/Nov/2016.
*/
@RepositoryRestResource
public interface RepositorioCuentas extends JpaRepository<CuentaBancaria, Long> {


CuentaBancaria findById(@Param("id") Long id);

Collection<CuentaBancaria> findByTitularCuenta(@Param("tc") String titularCuenta);

}

4. Controlador MVC (envía información a Thymeleaf).

/**
* Código generado por Gerado Pucheta Figueroa
* Twitter: @ledzedev
* http://ledze.mx
* 14/Nov/2016.
*/
@Controller
public class ControladorMvcRestCuentaBancaria {


@Autowired
private RepositorioCuentas repositorioCuentas;


@RequestMapping("/cuentasBancarias.aspx")
String estadoDeCuenta(Model model){

model.addAttribute("cuentas", this.repositorioCuentas.findAll());

return "estadoDeCuenta";
}

}

 

5. Configuración carga inicial de la aplicación: CommandLineRunner.

/**
* Código generado por Gerado Pucheta Figueroa
* Twitter: @ledzedev
* http://ledze.mx
* 14/Nov/2016.
*/
@Bean
CommandLineRunner runner(RepositorioCuentas repositorioCuentas){

return x -> {
Arrays.asList(new CuentaBancaria("Gerardo", "1000.00"),
new CuentaBancaria("Ledze", "2000.00"),
new CuentaBancaria("Maribel", "3000.00"),
new CuentaBancaria("Santiago", "4000.00"),
new CuentaBancaria("Yara", "5000.00"),
new CuentaBancaria("Esperanza", "6000.00"),
new CuentaBancaria("Paolo", "7000.00"),
new CuentaBancaria("Sio", "8000.00"),
new CuentaBancaria("Angel", "9000.00")
)
.forEach(repositorioCuentas::save);
log.info("Carga inicial de cuentas bancarias terminada.");
};
}

6. Plantilla HTML con soporte Thymeleaf.

<!DOCTYPE HTML>
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:th="http://www.thymeleaf.org">

<head>
<title>Ejemplo RESTful viejito en MVC con Thymeleaf</title>
<meta http-equiv="content-type" content="text/html; charset=UTF-8" />
</head>
<body>
<h1>ESTADO DE CUENTA</h1>

<div th:each="cb : ${cuentas}">
<div>
<b th:text="${cb.id}">ID</b>
<span th:text="${cb.titularCuenta}">Titular de la cuenta</span>
<span th:text="${cb.saldoDisponible}">Saldo disponible</span>
</div>
</div>

</body>
</html>

7. Resultado en web (en mi caso Google Chrome).

- Además de Thymeleaf, Spring Boot tiene soporte para otros frameworks de plantillas como Handlebars, Velocity, etc.

 

Extra bonus (Actuator y Remote Shell)

Como resultado de agregar spring-boot-starter-actuator, se publican una serie de servicios que entregan información útil en un ambiente productivo.

- Actuator

 

- Autoconfig

 

- Beans

 

- Configprops

 

- Dump

 

- Env

 

- Health

 

- Mappings

 

- Metrics

 

- Trace

 

- Remote Shell

Presenta las mismas opciones pero en una consola remota. Únicamente hay que agregar al pom.xml la dependencia "spring-boot-starter-remote-shell".

La contraseña de acceso es generada aleatoriamente al arrancar la aplicación:

La consola se ve así:

 

 Te puedes descargar mi código directamente de mi repositorio en github o te los puedes descargar en formato zip.

 

Artículos Relacionados

- Spring Boot Initializr

Documentación Original

- Spring Boot

- Spring Boot Actuator

- Spring Boot Remote Shell