java - Spring Boot 中的 LocalDateTime 格式
问题描述
嘿,我遇到了与这里相同的问题:Spring Boot 中的 JSON Java 8 LocalDateTime 格式我从那里尝试了解决方案,但它不起作用。有人能告诉我我做错了什么吗?
我添加了
spring.jackson.serialization.write-dates-as-timestamps=false
到 application.property 我的模型类如下所示:
package bookrental.model.book;
import bookrental.model.account.User;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.fasterxml.jackson.databind.util.ISO8601DateFormat;
import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateTimeDeserializer;
import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateTimeSerializer;
import lombok.*;
import javax.persistence.*;
import java.time.LocalDateTime;
import java.util.Date;
@Entity
@Getter
@Setter
@EqualsAndHashCode
@AllArgsConstructor
@NoArgsConstructor
public class BookRentals {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private int id;
@OneToOne
private Book book;
@OneToOne
private User user;
@JsonFormat(pattern = ("yyyy/MM/dd HH:mm:ss"))
@JsonSerialize(using = LocalDateTimeSerializer.class)
@JsonDeserialize(using = LocalDateTimeDeserializer.class)
private LocalDateTime dateOfRental;
public BookRentals(Book book, User user) {
this.book = book;
this.user = user;
}
}
我这样设置时间:
private BookRentals prepareBookToRent(int userID, Book book) {
BookRentals bookRentals = new BookRentals(book, new User(userID));
bookRentals.setDateOfRental(LocalDateTime.now());
return bookRentals;
}
我添加了依赖:
<dependency>
<groupId>com.fasterxml.jackson.datatype</groupId>
<artifactId>jackson-datatype-jsr310</artifactId>
<version>2.9.7</version>
</dependency>
我的 JSON 看起来像这样:
[
{
"book": {
"author": "Henryk Sienkiewicz",
"category": "powieść historyczna",
"id": 1,
"title": "Krzyżacy"
},
"class": "bookrental.model.book.BookRentals",
"dateOfRental": {
"class": "java.time.LocalDateTime",
"dayOfMonth": 19,
"dayOfWeek": "WEDNESDAY",
"dayOfYear": 353,
"hour": 0,
"minute": 13,
"month": "DECEMBER",
"monthValue": 12,
"nano": 758649300,
"second": 8,
"year": 2018
},
"id": 1,
"user": {
"id": 2,
"name": "piotri",
"password": "123"
}
}
]
我还应该做什么?
我没有尝试使用类的解决方案,因为我不知道应该将它们放在哪个包中。//编辑 根据 Erik 的建议,pom.xml 看起来像这样:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.book.rental.piotrek</groupId>
<artifactId>BookRental</artifactId>
<version>1.0-SNAPSHOT</version>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>8</source>
<target>8</target>
</configuration>
</plugin>
</plugins>
</build>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.1.RELEASE</version>
<relativePath/>
</parent>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.16.22</version>
</dependency>
<dependency>
<groupId>javax.validation</groupId>
<artifactId>validation-api</artifactId>
</dependency>
<dependency>
<groupId>net.sf.flexjson</groupId>
<artifactId>flexjson</artifactId>
<version>2.1</version>
</dependency>
</dependencies>
</project>
升级没用。JSON:
[
{
"book": {
"author": "Henryk Sienkiewicz",
"category": "powieść historyczna",
"id": 1,
"title": "Krzyżacy"
},
"dateOfRental": {
"dayOfMonth": 19,
"dayOfWeek": "WEDNESDAY",
"dayOfYear": 353,
"hour": 11,
"minute": 22,
"month": "DECEMBER",
"monthValue": 12,
"nano": 884499000,
"second": 17,
"year": 2018
},
"id": 7,
"user": {
"id": 5,
"name": "admin",
"password": "123"
}
}
]
图书租赁:
package bookrental.model.book;
import bookrental.model.account.User;
import lombok.*;
import javax.persistence.*;
import java.time.LocalDateTime;
@Entity
@Getter
@Setter
@EqualsAndHashCode
@AllArgsConstructor
@NoArgsConstructor
public class BookRentals {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private int id;
@OneToOne
private Book book;
@OneToOne
private User user;
private LocalDateTime dateOfRental;
public BookRentals(Book book, User user) {
this.book = book;
this.user = user;
}
}
//编辑2
嘿。不小心找到了问题的原因。我有一个班级负责为确切的用户找到确切的 rantals。当我去/books/rentals/{userID}
我得到正确格式化的日期时。如您所见,方法 return List<BookRentals>
。在BookRentalsService
我返回 ResponseEntity 时,我认为它看起来像这样。你知道如何解决吗?
package bookrental.service.account;
import bookrental.model.book.BookRentals;
import bookrental.repository.book.BookRentalsRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
@Service
public class UserRentalsService {
private final BookRentalsRepository bookRentalsRepository;
@Autowired
public UserRentalsService(BookRentalsRepository bookRentalsRepository) {
this.bookRentalsRepository = bookRentalsRepository;
}
public List<BookRentals> findUserRentalsByGivenID(int userID) {
return bookRentalsRepository.getUserRentalsByGivenID(userID);
}
}
package bookrental.controller.account;
import bookrental.model.book.BookRentals;
import bookrental.service.account.UserRentalsService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
@RestController
public class UserRentalsController {
private final UserRentalsService userRentalsService;
@Autowired
public UserRentalsController(UserRentalsService userRentalsService) {
this.userRentalsService = userRentalsService;
}
@GetMapping("books/rentals/{userID}")
public List<BookRentals> findUserRentalsByGivenID(@PathVariable int userID) {
return userRentalsService.findUserRentalsByGivenID(userID);
}
}
图书租赁服务
package bookrental.service.book.rentals;
import bookrental.model.account.User;
import bookrental.model.book.Book;
import bookrental.model.book.BookRentals;
import bookrental.repository.account.UserRepository;
import bookrental.repository.book.BookRepository;
import bookrental.repository.book.BookRentalsRepository;
import flexjson.JSONSerializer;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Service;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.List;
@Service
public class BookRentalService {
private final UserRepository userRepository;
private final BookRepository bookRepository;
private final BookRentalsRepository bookRentalsRepository;
@Autowired
public BookRentalService(BookRepository bookRepository, BookRentalsRepository bookRentalsRepository, UserRepository userRepository) {
this.bookRepository = bookRepository;
this.bookRentalsRepository = bookRentalsRepository;
this.userRepository = userRepository;
}
....
public ResponseEntity<String> findAllRentals() {
List<BookRentals> rentedBooks = new ArrayList<>();
bookRentalsRepository.findAll().forEach(rentedBooks::add);
HttpHeaders headers = new HttpHeaders();
headers.add("Content-Type", "application/json; charset=utf-8");
return new ResponseEntity<>(new JSONSerializer().exclude("book.class")
.exclude("book.available")
.exclude("dateOfReturn")
.exclude("*.class")
.exclude("user.amountOfCashToPay")
.exclude("password")
.serialize(rentedBooks), headers, HttpStatus.OK);
}
}
解决方案
这是使用 Spring 2.1.1 的更新示例:
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import java.time.LocalDateTime;
@SpringBootApplication
class PipilamApplication {
public static void main(String[] args) {
SpringApplication.run(PipilamApplication.class, args);
}
}
@RestController
class Controller {
@GetMapping("/demo")
public Demo demo() {
return new Demo("pipilam",LocalDateTime.now());
}
}
@Data
@AllArgsConstructor
@NoArgsConstructor
class Demo {
String name;
LocalDateTime dateTime;
}
连接到http://localhost:8080/demo会得到以下输出:
{"name":"pipilam","dateTime":"2018-12-19T20:16:12.780268"}
无需配置或注释。考虑我以前的答案已弃用。这是我使用的 pom.xml:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.1.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.stackoverflow</groupId>
<artifactId>pipilam</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>pipilam</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
你可以在这里找到 Github 中的项目:https ://github.com/bodiam/spring-boot-java8-json-time
推荐阅读
- c# - C# System.IO IOException“无法访问文件,因为它被另一个进程访问”
- reactjs - firebase 按索引从字段数组中删除对象
- r - 无法使用 Tigris 进行地理编码
- firebase - Flutter web - 加载网络图片失败
- typescript - 在 TypeScript 中与 Async-Await 并行处理获取请求的最佳方法?
- python - 在 Python 环境中迭代模型构建器翻译中的表
- javascript - 如何为每张滚动进出视图的幻灯片更新固定的 h1 标题和触发动画?
- shell - 通过 Process_run 在 Flutter 中嵌入 Shell 脚本命令
- python-3.x - 麻烦根据python3和pandas中的列值更改csv行
- visual-studio-2017 - Oracle 自定义类向导 Visual Studio 2017