【问题标题】:Failing to Deserialize LocalDate Value in REST WS无法在 REST WS 中反序列化 LocalDate 值
【发布时间】:2019-07-07 00:22:27
【问题描述】:

我使用一个非常简单的REST WSSpringBootPostMan 来发送、接收和显示数据。问题是,反序列化 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();
        }
    }

【问题讨论】:

    标签: java rest spring-boot jackson postman


    【解决方案1】:

    您可以尝试编写自定义 JsonDeserializer 来处理您希望接受的格式的日期反序列化: JSON serialization strategy for dates

    【讨论】:

    • 这就是我所需要的。谢谢。
    猜你喜欢
    • 2020-09-25
    • 2015-03-04
    • 2018-09-29
    • 2021-06-09
    • 2017-10-24
    • 2019-10-16
    • 1970-01-01
    • 1970-01-01
    • 2015-09-01
    相关资源
    最近更新 更多