spring-boot
Démarrage du printemps + interface Web Hibernate + (Thymeleaf)
Recherche…
Introduction
Ce thread se concentre sur la façon de créer une application de démarrage à ressort avec le moteur de modèle hibernate et thymyleaf.
Remarques
Consultez également la documentation Thymeleaf
Dépendances Maven
Cet exemple est basé sur Spring Boot 1.5.1.RELEASE. avec les dépendances suivantes:
<!-- 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>
Dans cet exemple, nous allons utiliser Spring Boot JPA, Thymeleaf et les démarreurs Web. J'utilise Lombok pour générer des getters et des setters plus faciles, mais ce n'est pas obligatoire. H2 sera utilisé comme base de données facile à configurer en mémoire.
Configuration Hibernate
Tout d'abord, permet de visualiser ce dont nous avons besoin pour configurer correctement Hibernate.
-
@EnableTransactionManagement
et@EnableJpaRepositories
- nous voulons une gestion transactionnelle et utiliser des référentiels de données de printemps. -
DataSource
- source de données principale pour l'application. en utilisant h2 en mémoire pour cet exemple. -
LocalContainerEntityManagerFactoryBean
- usine de gestionnaire d'entités printemps utilisantHibernateJpaVendorAdapter
. -
PlatformTransactionManager
- gestionnaire de transactions principal pour les composants annotés@Transactional
.
Fichier de configuration:
@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;
}
}
Entités et référentiels
Une entité simple: Utiliser les @Getter
Lombok @Getter
et @Setter
pour générer des @Getter
et des @Setter
pour nous
@Entity
@Getter @Setter
public class Message {
@Id
@GeneratedValue(generator = "system-uuid")
@GenericGenerator(name = "system-uuid", strategy = "uuid")
private String id;
private String message;
}
J'utilise des identifiants basés sur UUID et lombok pour générer des getters et des setters.
Un référentiel simple pour l'entité ci-dessus:
@Transactional
public interface MessageRepository extends CrudRepository<Message, String> {
}
Plus sur les dépositaires: docs de données de printemps
Assurez-vous que les entités résident dans un package mappé dans em.setPackagesToScan
(défini dans le bean LocalContainerEntityManagerFactoryBean
) et dans les référentiels d'un package mappé dans basePackages
(défini dans l'annotation @EnableJpaRepositories
)
Thymeleaf Resources et Spring Controller
Afin d'exposer les modèles Thymeleaf, nous devons définir des contrôleurs.
Exemple:
@Controller
@RequestMapping("/")
public class MessageController {
@Autowired
private MessageRepository messageRepository;
@GetMapping
public ModelAndView index() {
Iterable<Message> messages = messageRepository.findAll();
return new ModelAndView("index", "index", messages);
}
}
Ce contrôleur simple injecte MessageRepository
et transmet tous les messages à un fichier modèle nommé index.html
, résidant dans src/main/resources/templates
et enfin l'expose dans /index
.
De la même manière, nous pouvons placer d’autres modèles dans le dossier des modèles (par défaut au printemps dans src/main/resources/templates
), leur transmettre un modèle et les transmettre au client.
Les autres ressources statiques doivent être placées dans l'un des dossiers suivants, exposés par défaut au démarrage du printemps:
/META-INF/resources/
/resources/
/static/
/public/
Thymeleaf index.html
exemple:
<!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
trouve dans le dossiersrc/main/resources/static/css
. Vous pouvez utiliser la syntaxe@{}
pour obtenir d'autres ressources statiques en utilisant le chemin relatif.