对于所有有兴趣在没有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