spring-boot
Spring boot + Hibernate + Web UI (Thymeleaf)
Zoeken…
Invoering
Deze thread is gericht op het maken van een spring boot-applicatie met een winterslaap- en thymyleaf-sjabloon-engine.
Opmerkingen
Maven afhankelijkheden
Dit voorbeeld is gebaseerd op spring boot 1.5.1.RELEASE. met de volgende afhankelijkheden:
<!-- 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>
In dit voorbeeld gaan we Spring Boot JPA, Thymeleaf en webstarters gebruiken. Ik gebruik Lombok om gemakkelijker getters en setters te genereren, maar het is niet verplicht. H2 zal worden gebruikt als een in het geheugen eenvoudig te configureren database.
Slaapstand configuratie
Laten we eerst een overzicht geven van wat we nodig hebben om de slaapstand correct in te stellen.
-
@EnableTransactionManagement
en@EnableJpaRepositories
- we willen transactiebeheer en gebruiken lente data repositories. -
DataSource
- belangrijkste gegevensbron voor de toepassing. gebruik van geheugen H2 voor dit voorbeeld. -
LocalContainerEntityManagerFactoryBean
- fabriek voor lente-entiteitsbeheer metHibernateJpaVendorAdapter
. -
PlatformTransactionManager
- hoofdtransactiebeheer voor geannoteerde@Transactional
componenten.
Configuratiebestand:
@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;
}
}
Entiteiten en repositories
Een eenvoudige entiteit: Lombok @Getter
en @Setter
annotaties gebruiken om getters en setters voor ons te genereren
@Entity
@Getter @Setter
public class Message {
@Id
@GeneratedValue(generator = "system-uuid")
@GenericGenerator(name = "system-uuid", strategy = "uuid")
private String id;
private String message;
}
Ik gebruik UUID-gebaseerde id's en lombok om getters en setters te genereren.
Een eenvoudige repository voor de entiteit hierboven:
@Transactional
public interface MessageRepository extends CrudRepository<Message, String> {
}
Meer over bewaarplaatsen: voorjaarsgegevens docs
Zorg ervoor dat entiteiten zich bevinden in een pakket dat is toegewezen in em.setPackagesToScan
(gedefinieerd in LocalContainerEntityManagerFactoryBean
bean) en repositories in een pakket dat is toegewezen in basePackages
(gedefinieerd in annotatie @EnableJpaRepositories
)
Thymeleaf Resources en Spring Controller
Om Thymeleaf-sjablonen bloot te leggen, moeten we controllers definiëren.
Voorbeeld:
@Controller
@RequestMapping("/")
public class MessageController {
@Autowired
private MessageRepository messageRepository;
@GetMapping
public ModelAndView index() {
Iterable<Message> messages = messageRepository.findAll();
return new ModelAndView("index", "index", messages);
}
}
Deze eenvoudige controller injecteert MessageRepository
en geeft alle berichten door aan een sjabloonbestand met de naam index.html
, dat zich bevindt in src/main/resources/templates
, en geeft het uiteindelijk weer op /index
.
Op dezelfde manier kunnen we andere sjablonen in de sjablonenmap plaatsen (standaard door spring naar src/main/resources/templates
), een model aan hen doorgeven en ze aan de client aanbieden.
Andere statische bronnen moeten in een van de volgende mappen worden geplaatst, die standaard worden weergegeven tijdens de voorjaarsstart:
/META-INF/resources/
/resources/
/static/
/public/
Thymeleaf index.html
voorbeeld:
<!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
bevindt zich in de mapsrc/main/resources/static/css
. u kunt de syntaxis@{}
gebruiken om andere statische bronnen te verkrijgen met behulp van het relatieve pad.