Эй, у меня та же проблема, что и здесь: JSON Java 8 LocalDateTime формат в Spring Boot Я пробовал решения оттуда, и он не работает.Может кто-нибудь сказать мне, что я сделал не так?
Я добавил
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"
}
}
]
Что еще мне следует сделать?
Я не пробовал решения с классами, потому что я не знаю, куда мне поместить их в какой пакет.// EDIT После совета Эрика 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"
}
}
]
BookRentals:
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;
}
}
// EDIT2
Привет.Случайно обнаружил причину проблемы.У меня есть класс, который отвечает за поиск точных рассказов для конкретного пользователя.Когда я иду на /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);
}
}
BookRentalsService
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);
}
}