角日期选择器如何解析为Java Date?

时间:2019-01-27 20:34:19

标签: angular spring spring-boot

我有一个带有Angular前端和Spring Boot作为后端的待办事项应用程序。我是Spring Boot的新手,可能需要进一步说明。感谢您的理解。

我的问题是解析从有角度的日期选择器组件获得的日期格式,以键入日期。这是我当前遇到的错误:

"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 boot date serialization

由于我当前正在以ToDo实体的身份从用户那里收到帖子,

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

我应该如何提取用户输入的日期?然后,我将解析日期,然后将其保存。在我脑海中,它应该然后起作用...

感谢您的帮助或建议

1 个答案:

答案 0 :(得分:1)

为此,您可能需要使用LocalDateSerializerLocalDateDeserializer

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();
}
}