对于所有有兴趣在没有Spring Boot的情况下快速引导Spring 4应用程序的开发人员,请检查刚刚更新的我的Spring MVC 4 Quickstart Maven原型。 原型已经将Java 8用作目标平台已有一段时间了,但是不支持特定的Java 8功能。 最近的更改带来了Thymeleaf,Jackson和JPA对Java 8 Data&Time API的支持(除了一些错误修复)。
Thymeleaf JSR 310(Java 8日期和时间)支持
如果您碰巧使用Spring MVC和Thymeleaf,并且需要在视图中格式化Java 8 Date&Time对象,则现在可以使用thymeleaf-extras-java8time –用于Java 8 Date&Time API的Thymeleaf模块。
修改了POM并添加了新的依赖项:
<dependency>
<groupId>org.thymeleaf.extras</groupId>
<artifactId>thymeleaf-extras-java8time</artifactId>
<version>2.1.0.RELEASE</version>
</dependency>
此外, Java8TimeDialect已添加到TemplateEngine :
@Bean
public SpringTemplateEngine templateEngine() {
SpringTemplateEngine templateEngine = new SpringTemplateEngine();
templateEngine.setTemplateResolver(templateResolver());
templateEngine.addDialect(new SpringSecurityDialect());
templateEngine.addDialect(new Java8TimeDialect());
return templateEngine;
}
Java8TimeDialect是,在表达式求值期间将temporals对象作为实用程序对象添加到上下文。 这意味着它可以在OGNL或SpringEL表达式评估中使用:
<div th:fragment="footer" th:align="center">
© <span th:text="${#temporals.format(#temporals.createNow(), 'yyyy')}">2016</span>,
<span th:text="${@environment.getProperty('app.version')}"></span>
</div>
Jackson JSR 310(Java 8日期和时间)支持
为了能够使用Jackson序列化或反序列化java.time类型,必须使用外部数据类型模块。 该模块是jackson-datatype-jsr310 。
修改了POM并添加了新的依赖项:
<dependency>
<groupId>com.fasterxml.jackson.datatype</groupId>
<artifactId>jackson-datatype-jsr310</artifactId>
</dependency>
我们不需要提供版本,因为项目中使用了Spring IO平台。 而且,如果您不知道,Spring IO Platform的主要优势在于它通过提供Spring项目的版本以及经过测试并已知可以一起工作的依赖项,简化了依赖项管理。
目前不需要其他配置,因为该模块将由Spring自动注册。 这是通过org.springframework.http.converter.json.Jackson2ObjectMapperBuilder完成的。
一个例子?
{
"id": 2,
"email": "admin",
"role": "ROLE_ADMIN",
"created": 1454017095.878
}
其中created是Instant ,序列化为小数(默认)。
- 在此处了解有关此模块的更多信息: https : //github.com/FasterXML/jackson-datatype-jsr310
JPA JSR 310(Java 8日期和时间)支持
JPA 2.1不支持将java.time类型映射为SQL有效日期或时间戳类型。 值得一提的是,它带来了一个新的AttributeConverter接口,并且“可以使用实现该接口的类将实体属性状态转换为数据库列表示形式,然后再转换回来。” 。
此类转换器是Spring Data JPA项目的一部分,并且在Jsr310JpaConverters类中可用。 此类将新的java.time类型转换为旧的Date类型。
通过使org.springframework.data.jpa.convert.threeten包由LocalContainerEntityManagerFactoryBean进行扫描,可以激活转换器:
@Bean
public LocalContainerEntityManagerFactoryBean emf(DataSource dataSource) {
[...]
String entities = ClassUtils.getPackageName(Application.class);
String converters = ClassUtils.getPackageName(Jsr310JpaConverters.class);
entityManagerFactoryBean.setPackagesToScan(entities, converters);
[...]
return entityManagerFactoryBean;
}
如果使用的是PostgreSQL,则java.time.Instant类型现在将以TIMESTAMP形式存储在PostgreSQL中,而不是BYTEA (因为没有转换器)。
在此处了解更多有关JPA 2.1和JSR 310的支持: http : //www.thoughts-on-java.org/persist-localdate-localdatetime-jpa/
在哪里找到它?
- 在GitHub上找到更新原型: https : //github.com/kolorobot/spring-mvc-quickstart-archetype
我很期待听到可以做些什么来使其成为一个更好的项目。 如果您有想法或建议,请发表评论或提出问题。
翻译自: https://www.javacodegeeks.com/2016/02/spring-mvc-4-quickstart-maven-archetype-improved-java-8-features.html