Я использую очень простые REST WS
с SpringBoot
и PostMan
для отправки, получения и отображения данных.Проблема в том, что, кажется, есть проблема с десериализацией значения Date
, и по какой-то причине он принимает только этот формат yyyy-mm-dd
(разделенный черточками).
Так, например, если я отправлю следующееданные из Postman
, я получаю ответ без проблем:
{
"server":{
"address":"url",
"port":2555525
},
"date":"2019-02-13"
}
Однако, если я сделаю следующее ( дата значения без черточек ):
{
"server":{
"address":"url",
"port":2555525
},
"date":"20190213"
}
Я получаю следующую ошибку:
{
"timestamp": 1550046097893,
"status": 400,
"error": "Bad Request",
"message": "JSON parse error: Cannot deserialize value of type `java.time.LocalDate` from String \"20190213\": Failed to deserialize java.time.LocalDate: (java.time.format.DateTimeParseException) Text '20190213' could not be parsed at index 0; nested exception is com.fasterxml.jackson.databind.exc.InvalidFormatException: Cannot deserialize value of type `java.time.LocalDate` from String \"20190213\": Failed to deserialize java.time.LocalDate: (java.time.format.DateTimeParseException) Text '20190213' could not be parsed at index 0\n at [Source: (PushbackInputStream); line: 6, column: 9] (through reference chain: com.restws.webservices.model.Admin[\"date\"])",
"path": "/v3/admin/device"
}
Я хотел бы добиться возможности десериализации даты независимо от формата, введенного в PostMan
.Есть ли способ сделать это?
Вот мой контроллер:
@Controller
@RequestMapping("/v3/admin/")
public class AdminController {
Logger logger = LoggerFactory.getLogger(AdminController.class);
@Autowired
private ObjectMapper objectMapper;
@RequestMapping(method = RequestMethod.POST, value = "/device", consumes ="application/json")
public ResponseEntity putDevice(@RequestBody Admin admin) throws IOException {
logger.info(admin.toString());
String adminString = admin.toString();
return new ResponseEntity<>(adminString, HttpStatus.OK);
}
}
И POJO:
@JsonIgnoreProperties(ignoreUnknown = true)
public class Admin {
@JsonProperty("server")
private Server server;
@JsonProperty("date")
private LocalDate date;
public Admin() {
}
public Server getServer() {
return server;
}
public void setServer(Server server) {
this.server = server;
}
public LocalDate getDate() {
return date;
}
public void setDate(LocalDate date) {
this.date = date;
}
@Override
public String toString() {
return new ToStringBuilder(this).append("server", server).append("date", date).toString();
}
}
//
public class Server {
@JsonProperty("address")
private String address;
@JsonProperty("port")
private int port;
public Server() {
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
public int getPort() {
return port;
}
public void setPort(int port) {
this.port = port;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Server server = (Server) o;
return new EqualsBuilder().append(port, server.port).append(address, server.address).isEquals();
}
@Override
public int hashCode() {
return new HashCodeBuilder(17, 37).append(address).append(port).toHashCode();
}
@Override
public String toString() {
return new ToStringBuilder(this).append("address", address).append("port", port).toString();
}
}