【问题标题】:Configure LocaldateTime in Spring Rest API在 Spring Rest API 中配置 LocaldateTime
【发布时间】:2019-04-21 07:09:45
【问题描述】:

我使用 Java 10 和最新的 Spring spring-boot-starter-parent 2.1.0.RELEASE

POM 配置:

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.1.0.RELEASE</version>
    </parent>

    <dependencies>          
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>javax.servlet-api</artifactId>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>com.fasterxml.jackson.dataformat</groupId>
            <artifactId>jackson-dataformat-xml</artifactId>
            <version>2.9.7</version>
        </dependency>
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-annotations</artifactId>
            <version>2.9.7</version>
            <scope>compile</scope>
        </dependency>
        <dependency>
            <groupId>com.fasterxml.jackson.module</groupId>
            <artifactId>jackson-module-jaxb-annotations</artifactId>
            <version>2.9.7</version>
        </dependency>
        <dependency>
            <groupId>com.fasterxml.jackson.jaxrs</groupId>
            <artifactId>jackson-jaxrs-json-provider</artifactId>
            <version>2.9.7</version>
        </dependency>
        <dependency>
            <groupId>commons-io</groupId>
            <artifactId>commons-io</artifactId>
            <version>2.6</version>
        </dependency>
        <dependency>
            <groupId>org.codehaus.woodstox</groupId>
            <artifactId>woodstox-core-asl</artifactId>
            <version>4.4.1</version>
        </dependency>
        <dependency>
            <groupId>javax.xml.bind</groupId>
            <artifactId>jaxb-api</artifactId>
            <version>2.3.1</version>
        </dependency>
        <dependency>
            <groupId>com.sun.xml.bind</groupId>
            <artifactId>jaxb-core</artifactId>
            <version>2.3.0.1</version>
        </dependency>
        <dependency>
            <groupId>com.sun.xml.bind</groupId>
            <artifactId>jaxb-impl</artifactId>
            <version>2.3.1</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>
        <dependency>
            <groupId>org.mapstruct</groupId>
            <artifactId>mapstruct-jdk8</artifactId>
            <version>1.2.0.Final</version>
        </dependency>
        <dependency>
            <groupId>org.jxls</groupId>
            <artifactId>jxls-poi</artifactId>
            <version>1.0.15</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
            <exclusions>
                <exclusion>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-starter-tomcat</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>javax</groupId>
            <artifactId>javaee-api</artifactId>
            <version>8.0</version>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.security.oauth</groupId>
            <artifactId>spring-security-oauth2</artifactId>
            <version>2.3.4.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.security.oauth.boot</groupId>
            <artifactId>spring-security-oauth2-autoconfigure</artifactId>
            <version>2.1.0.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-security</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-amqp</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-thymeleaf</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.session</groupId>
            <artifactId>spring-session-core</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-mail</artifactId>
        </dependency>
    </dependencies>

休息端点:

    @GetMapping("{id}")
    public ResponseEntity<?> get(@PathVariable String id) {
        return transactionRepository
                .findById(Integer.parseInt(id))
                .map(mapper::toDTO)
                .map(ResponseEntity::ok)
                .orElseGet(() -> notFound().build());
    }

DTO:

public class PaymentTransactionsDTO {

    private Integer id;

    private String status;

    private LocalDateTime created_at;

    private String merchant;
    .... getters and setters
}

但是当我尝试返回 LocalDateTime created_at 的 JSON 数据时,我得到空结果。我想 LocalDateTime 没有正确转换为 JSON 值。

您能否建议我如何解决此问题?

【问题讨论】:

标签: spring spring-boot spring-data-jpa spring-data


【解决方案1】:

尝试在 created_at 字段上使用@JsonFormat。

@JsonFormat(pattern="yyyy-MM-dd")
@DateTimeFormat(iso = DateTimeFormat.ISO.TIME)
private LocalDateTime created_at;

【讨论】:

  • 不,这不能解决问题。
  • 可能我在 DTO 上应用此注释,而不是在 JPA 实体中?
  • 您只需要在 DTO 上应用它。您可以使用字符串而不是本地日期时间来使用解决方法,并将本地日期时间转换为字符串。这不是最好的方法,但可能会有所帮助。
  • 您也可以尝试stackoverflow.com/questions/28802544/…的解决方案
【解决方案2】:

您需要添加转换器并在 spring 中注册,例如。 baeldung.com/spring-mvc-custom-data-binder

【讨论】:

    【解决方案3】:

    JSON 序列化由 Jackson 的 ObjectMapper 驱动,我建议明确配置。为了正确序列化 Java 8 日期和时间对象,请确保

    • 注册JavaTimeModule
    • 禁用将日期写入时间戳
    • 设置日期格式(使用StdDateFormat

    StdDateFormat的描述:

    标准日期使用的默认DateFormat实现 序列化器和反序列化器。对于序列化默认使用 ISO-8601 兼容格式(格式字符串“yyyy-MM-dd'T'HH:mm:ss.SSSZ”) 对于反序列化,ISO-8601 和 RFC-1123

    推荐配置:

    @Configuration
    public class JacksonConfig {
    
        @Bean
        public ObjectMapper objectMapper() {
            return new ObjectMapper()
                .setAnnotationIntrospector(new JacksonAnnotationIntrospector())
                .registerModule(new JavaTimeModule())
                .setDateFormat(new StdDateFormat())
                .disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);
        }
    

    } }

    序列化日期和时间对象示例:

    • LocalDate: 2018-11-21
    • LocalTime11:13:13.274
    • LocalDateTime: 2018-11-21T11:13:13.274
    • ZonedDateTime: 2018-11-21T11:13:13.274+01:00

    编辑:独立依赖项(已在spring-boot-starter-web 中传递):

    • com.fasterxml.jackson.core:jackson-annotations
    • com.fasterxml.jackson.core:jackson-databind
    • com.fasterxml.jackson.datatype:jackson-datatype-jsr310

    【讨论】:

    • register the JavaTimeModule 是什么意思?添加maven依赖?
    • 表示mapper.registerModule(new JavaTimeModule());这一行。我编辑了帖子以列出所需的显式杰克逊模块,但是它们已经包含在 spring-boot-starter-web 中。
    【解决方案4】:

    您可以将 PaymentTransactionsDTO“created_at”属性键入为字符串,并使用转换器将字符串转换为 LocalDate(实体“PaymentTransactions”的 created_at 属性的类型)

    @Component
    public class PaymentTransactionsConverter implements Converter<PaymentTransactionsDTO, PaymentTransactions> {
    
        @Override
        public PaymentTransactions convert(PaymentTransactionsDTO paymentTransactionsDTO) {
    
            PaymentTransactions paymentTransactions = new PaymentTransactions();
            DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
    
            ...
    
            paymentTransactions.setCreated_at(LocalDate.parse(paymentTransactionsDTO.getCreated_at(), formatter));
    
            return paymentTransactions;
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-06-11
      • 1970-01-01
      • 2014-07-19
      • 1970-01-01
      • 1970-01-01
      • 2020-08-05
      • 2014-11-17
      • 1970-01-01
      相关资源
      最近更新 更多