spring-boot
Spring boot + Hibernate + Web UI (Thymeleaf)
Buscar..
Introducción
Este hilo se enfoca en cómo crear una aplicación de arranque de resorte con hibernación y motor de plantilla de hoja de timón.
Observaciones
También puedes ver la documentación de Thymeleaf
Dependencias maven
Este ejemplo se basa en Spring Boot 1.5.1.RELEASE. Con las siguientes dependencias:
<!-- Spring -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- Lombok -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<!-- H2 -->
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
</dependency>
<!-- Test -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
En este ejemplo vamos a utilizar Spring Boot JPA, Thymeleaf y web starters. Estoy usando Lombok para generar getters y setters más fáciles pero no es obligatorio. H2 se utilizará como una base de datos en la memoria fácil de configurar.
Configuración de hibernación
Primero, veamos lo que necesitamos para configurar Hibernate correctamente.
-
@EnableTransactionManagement
y@EnableJpaRepositories
: queremos una gestión transaccional y utilizar repositorios de datos Spring. -
DataSource
- fuente de datos principal para la aplicación. utilizando en memoria h2 para este ejemplo. -
LocalContainerEntityManagerFactoryBean
: fábrica de gestores de entidades de primavera que utilizaHibernateJpaVendorAdapter
. -
PlatformTransactionManager
- gestor de transacciones principal para@Transactional
anotó componentes.
Archivo de configuración:
@Configuration
@EnableTransactionManagement
@EnableJpaRepositories(basePackages = "com.example.repositories")
public class PersistanceJpaConfig {
@Bean
public DataSource dataSource() {
DriverManagerDataSource dataSource = new DriverManagerDataSource();
dataSource.setDriverClassName("org.h2.Driver");
dataSource.setUrl("jdbc:h2:mem:testdb;mode=MySQL;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=FALSE");
dataSource.setUsername("sa");
dataSource.setPassword("");
return dataSource;
}
@Bean
public LocalContainerEntityManagerFactoryBean entityManagerFactory(DataSource dataSource) {
LocalContainerEntityManagerFactoryBean em = new LocalContainerEntityManagerFactoryBean();
em.setDataSource(dataSource);
em.setPackagesToScan(new String[] { "com.example.models" });
JpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter();
em.setJpaVendorAdapter(vendorAdapter);
em.setJpaProperties(additionalProperties());
return em;
}
@Bean
public PlatformTransactionManager transactionManager(LocalContainerEntityManagerFactoryBean entityManagerFactory, DataSource dataSource) {
JpaTransactionManager tm = new JpaTransactionManager();
tm.setEntityManagerFactory(entityManagerFactory.getObject());
tm.setDataSource(dataSource);
return tm;
}
Properties additionalProperties() {
Properties properties = new Properties();
properties.setProperty("hibernate.hbm2ddl.auto", "update");
properties.setProperty("hibernate.dialect", "org.hibernate.dialect.H2Dialect");
return properties;
}
}
Entidades y Repositorios
Una entidad simple: utilizar las @Getter
Lombok @Getter
y @Setter
para generar @Getter
y @Setter
para nosotros
@Entity
@Getter @Setter
public class Message {
@Id
@GeneratedValue(generator = "system-uuid")
@GenericGenerator(name = "system-uuid", strategy = "uuid")
private String id;
private String message;
}
Estoy usando IDs y lombok basados en UUID para generar captadores y definidores.
Un repositorio simple para la entidad anterior:
@Transactional
public interface MessageRepository extends CrudRepository<Message, String> {
}
Más sobre respositories: documentos de datos de primavera
Asegúrese de que las entidades residen en un paquete que está asignado en el em.setPackagesToScan
(definido en el frijol LocalContainerEntityManagerFactoryBean
) y los repositorios en un paquete asignado en los basePackages
(definidos en la anotación @EnableJpaRepositories
)
Recursos Thymeleaf y Spring Controller
Para exponer las plantillas de Thymeleaf necesitamos definir controladores.
Ejemplo:
@Controller
@RequestMapping("/")
public class MessageController {
@Autowired
private MessageRepository messageRepository;
@GetMapping
public ModelAndView index() {
Iterable<Message> messages = messageRepository.findAll();
return new ModelAndView("index", "index", messages);
}
}
Este controlador simple inyecta MessageRepository
y pasa todos los mensajes a un archivo de plantilla llamado index.html
, que reside en src/main/resources/templates
, y finalmente lo expone en /index
.
De la misma manera, podemos colocar otras plantillas en la carpeta de plantillas (por defecto, Spring to src/main/resources/templates
), pasarles un modelo y entregarlas al cliente.
Otros recursos estáticos se deben colocar en una de las siguientes carpetas, expuestas de forma predeterminada en Spring Boot:
/META-INF/resources/
/resources/
/static/
/public/
Ejemplo de Thymeleaf index.html
:
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head th:fragment="head (title)">
<title th:text="${title}">Index</title>
<link rel="stylesheet" th:href="@{/css/bootstrap.min.css}" href="../../css/bootstrap.min.css" />
</head>
<body>
<nav class="navbar navbar-default navbar-fixed-top">
<div class="container-fluid">
<div class="navbar-header">
<a class="navbar-brand" href="#">Thymeleaf</a>
</div>
</div>
</nav>
<div class="container">
<ul class="nav">
<li><a th:href="@{/}" href="messages.html"> Messages </a></li>
</ul>
</div>
</body>
</html>
-
bootstrap.min.css
está en la carpetasrc/main/resources/static/css
. puede usar la sintaxis@{}
para obtener otros recursos estáticos usando la ruta relativa.