Угловой DatePicker, как разобрать в Java Date? - PullRequest
0 голосов
/ 27 января 2019

У меня есть небольшое приложение todo с угловым интерфейсом и Spring Boot в качестве бэкэнда.Я очень новичок в Spring Boot и, возможно, потребуется дальнейшее объяснение.Спасибо за ваше понимание.

Моя проблема состоит в том, чтобы проанализировать формат даты, который я получаю из углового компонента DatePicker, в тип Date.Это текущая ошибка, которую я получаю:

"JSON parse error: Cannot deserialize instance of `java.util.Date` out of START_OBJECT token; nested exception is com.fasterxml.jackson.databind.exc.MismatchedInputException: Cannot deserialize instance of `java.util.Date` out of START_OBJECT token
        at[Source:(PushbackInputStream);line:1,column:73](through reference chain:todo.ToDo["dueDate"])"

Я искал решение и думаю, что нашел его, но я не совсем понимаю, как реализовать его в моей ситуации: Angular2 Springсериализация загрузочной даты

Поскольку в настоящее время я получаю сообщение от пользователя в виде объекта ToDo:

@PostMapping("/todos")
    ToDo newToDo(@RequestBody ToDo newToDo) {
        return repository.save(newToDo);
    }

Как извлечь дату, введенную пользователем?Затем я бы проанализировал дату и затем сохранил ее.В моей голове это должно сработать ...

Спасибо за любую помощь или предложения

1 Ответ

0 голосов
/ 28 января 2019

Для этого может потребоваться использовать LocalDateSerializer и LocalDateDeserializer.

Класс ToDo.

 public class ToDo {
  @JsonDeserialize(using = LocalDateDeserializer.class)
  @JsonSerialize(using = LocalDateSerializer.class)
  private LocalDate dueDate;

  // getters and setters

 }

LocalDateDeserializer.java

   import java.time.LocalDate;

   import com.fasterxml.jackson.core.JsonParser;
   import com.fasterxml.jackson.databind.DeserializationContext;
   import com.fasterxml.jackson.databind.deser.std.StdDeserializer;

  public class LocalDateDeserializer extends StdDeserializer<LocalDate> {

private static final long serialVersionUID = 1L;

protected LocalDateDeserializer() {
    super( LocalDate.class );
}

@Override
  public LocalDate deserialize( JsonParser jp, DeserializationContext ctxt ) {
    try {
        return LocalDate.parse( jp.readValueAs( String.class ) );
    }
    catch (Exception e) {
        // TODO: handle exception
        return null;
    }
}
}

LocalDateSerializer.Java

 import java.io.IOException;
 import java.time.LocalDate;
 import java.time.format.DateTimeFormatter;

import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.SerializerProvider;
import com.fasterxml.jackson.databind.ser.std.StdSerializer;

public class LocalDateSerializer extends StdSerializer<LocalDate>
{

private static final long serialVersionUID = 1L;

public LocalDateSerializer()
{
    super( LocalDate.class );
}

  @Override
  public void serialize( LocalDate value, JsonGenerator gen, SerializerProvider sp ) 
  throws IOException, JsonProcessingException
    {
        gen.writeString( value.format( DateTimeFormatter.ISO_LOCAL_DATE ) );
  }
}

А также вы должны передать дату в виде строки Пример: "2019-02-01".Передача объекта Date из внешнего интерфейса не является хорошей практикой.

    import { Component,Input } from '@angular/core';
   import {TodoService} from './todo.service';

@Component({
  selector: 'app-root',
   templateUrl: './app.component.html', 
  styleUrls: ['./app.component.scss']
 })
  export class AppComponent {
  title = 'ToDoApp';

constructor(private todoService: TodoService) {
}

@Input() toDoData = {name: '', dueDate: Date};

addToDo() {
    this.toDoData.dueDate = // formatted date
    this.todoService.addToDo(this.toDoData).subscribe((result) => {
        this.todoService.addToDo(this.toDoData);
        console.log(this.toDoData.dueDate);
    });
}

convertToMilliseconds(dueDate: DateConstructor) {
    return dueDate.valueOf();
}
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...