Строка в DateTime во время выполнения JAVA - PullRequest
0 голосов
/ 14 марта 2020

В моем запросе POJO есть свойство Дата рождения, которое является String. В моем ответе POJO дата рождения - это DateTime. Я преобразовал его в DateTime, используя «новый DateTime (requestModel.getDateOfBirth ())». Тем не менее, он принимает только формат даты (который находится в строке) как «гггг-мм-дд». Когда я меняю формат даты запроса, выдается «500

Blockquote

». Вот мои POJO:

RequestModel. java

public class RequestModel {
@NotNull(message = "dateOfBirth cannot be null")
private String dateOfBirth;

public RequestModel(String dateOfBirth) {
    super();
    this.dateOfBirth = dateOfBirth;
}
public String getDateOfBirth() {
    return dateOfBirth;
}

}

ResponseModel. java

public class ResponseModel {
private DateTime dateOfBirth;
public ResponseModel( DateTime dateOfBirth) {
    super();
    this.dateOfBirth = dateOfBirth;
}
public DateTime getDateOfBirth() {
    return dateOfBirth;
}
}

MyController. java

    @PostMapping(consumes = {
                            MediaType.APPLICATION_JSON_VALUE,
                            MediaType.APPLICATION_XML_VALUE
                        },
             produces = {
                        MediaType.APPLICATION_JSON_VALUE,
                        MediaType.APPLICATION_XML_VALUE
                        })
public ResponseEntity<ResponseModel> create(@Valid @RequestBody RequestModel requestModel) {
    ResponseModel response = new ResponseModel(new DateTime(requestModel.getDateOfBirth()));
    return new ResponseEntity<ResponseModel>(response, HttpStatus.CREATED);
}

Это сообщение JSON, которое отлично работает:

{
"dateOfBirth" : "2012-12-12"
}

Следующее тело запроса выдает ошибку:

{
"dateOfBirth" : "12-12-2012",
}

Ошибка :

{
"timestamp": "2020-03-14T19:09:51.647+0000",
"status": 500,
"error": "Internal Server Error",
"message": "Invalid format: \"12-12-2012\" is malformed at \"12\"",
"path": "/myPath/"
}

Я хочу знать, как я могу улучшить логику контроллера c или дизайн для принятия любого формата даты в API? Спасибо за помощь

Ответы [ 2 ]

2 голосов
/ 15 марта 2020

Во-первых, поскольку вы получаете дату без времени суток, вы должны предпочесть Joda-Time's LocalDate вместо DateTime.

Во-вторых, формат, который принимает конструктор (и LocalDate конструктор) ISO 8601, международный стандарт. Я должен сказать, что требование вашего клиента использовать этот формат в своем запросе было бы хорошо и рекомендовано.

Но если вы настаиваете: используйте средство форматирования для анализа строки из запроса в LocalDate.

    DateTimeFormatter dateFormatter = DateTimeFormat.forPattern("dd-MM-yyyy");

    String requestDateOfBirth = "12-12-2012";
    LocalDate dateOfBirth = LocalDate.parse(requestDateOfBirth, dateFormatter);

    System.out.println("Date of birth: " + dateOfBirth);

Вывод этого фрагмента:

Дата рождения: 2012-12-12

В 12-12-2012 Я не знал, какой день месяца, который был месяцем, но при необходимости вы можете поменять dd на день месяца и MM на месяц в строке шаблона формата.

И, наконец, если это новый код, вы вероятно, предпочтительнее использовать java .time, современный Java API даты и времени, а не Joda-Time. Официальная рекомендация проекта Joda-Time гласит о миграции.

Ссылки

1 голос
/ 14 марта 2020

Date (String date) является устаревшим конструктором.

Вы можете использовать класс Calendar для создания объекта DateTime

Calendar c = Calendar.getInstance();
c.set(2000,11,2);
Date d = c.getTime();
System.out.println(d.toString());

Это создает объект Date 2 декабря 2000 года.

Вам нужно разделить входную строку и манипулировать ею, прежде чем передать ее, чтобы получить метод

метод set принимает 3 аргумента.

set (int year, int month, int date) Устанавливает значения для полей календаря YEAR, MONTH и DAY_OF_MONTH.

Подробнее см. API календаря

https://docs.oracle.com/javase/7/docs/api/java/util/Calendar.html

...