#java #spring #spring-boot
Вопрос:
В моем приложении spring boot у меня есть 3 объекта: Набор встреч, дата встречи и время. На идентификатор MeetingSettingsId ссылаются как дата, так и время. время также имеет идентификатор даты в качестве ссылки. Я знаю, что хочу отправить такой json на свой сервер:
{
"meetingName":"hallo",
"meetingUrl":"",
"meetingPw":"s",
"dates":"2021-05-30",
"times":[
{
"startTime":"15:30",
"endTime":"16:30"
},
{
"startTime":"18:30",
"endTime":"19:30"
}
]
}
Но я получаю следующую ошибку:
not-null property references a null or transient value : com.cbc.coorporateblinddateservice.entities.times.Time.meetingDate
Я хочу сохранить с помощью одного метода встречи с показанным json.
Вот как выглядят мои сущности:
@Entity
@Table(name = "meeting_date")
@Data
public class Date {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(name = "meeting_date")
private String date;
@OneToMany(mappedBy = "meetingDate", cascade = CascadeType.ALL)
private List<Time> meetingTime = new ArrayList<>();
@ManyToOne()
@JoinColumn(name = "meeting_settings_name", nullable = false)
private MeetingsSetting meetingsSetting;
@JsonCreator
public static Date fromDateAsString(String dateString){
Date date = new Date();
date.setDate(dateString);
return date;
}
}
Встречи на высшем уровне:
@Entity
@Table(name = "meeting_settings")
@Data
public class MeetingsSetting {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(name = "meeting_name")
private String meetingName;
@Column(name = "meeting_url")
private String meetingUrl;
@Column(name = "meeting_pw")
private String meetingPw;
@OneToMany(mappedBy = "meetingsSetting", cascade = CascadeType.ALL)
private Date dates = new Date();
@OneToMany(mappedBy = "meetingsSetting", cascade = CascadeType.ALL)
private List<Time> times = new ArrayList<>();
}
и, наконец, время:
@Entity
@Table(name = "meeting_times")
@Data
public class Time {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(name = "start_time")
private String startTime;
@Column(name = "end_time")
private String endTime;
@ManyToOne()
@JoinColumn(name = "meeting_settings_name", nullable = false)
private MeetingsSetting meetingsSetting;
@ManyToOne()
@JoinColumn(name = "meeting_date_id")
private Date meetingDate;
}
это метод сохранения, который я использую, и здесь, вероятно, возникает ошибка. Я думаю, что мне тоже нужно сказать, чтобы сэкономить время и дату, если я не ошибаюсь, но я не знал, как это сделать, метод службы вызывает сохранение из jparepository:
@PostMapping("/")
public void saveMeeting(@RequestBody MeetingsSetting meetingsSetting){
meetingSettingService.saveMeeting(meetingsSetting);
}
Комментарии:
1. Я сам заметил несколько ошибок и соответствующим образом обновил вопрос
Ответ №1:
Проблема с вашей реализацией заключается в том, что вы предоставляете поле даты в виде строки, но в базовой модели оно представлено как объект типа Дата.
Вы должны убедиться, что ваша внутренняя модель представляет ваш json, например, введя DTOs ( объект передачи данных), соответствующий вашей модели json, а затем сопоставьте ее с вашими сущностями. Однако, если вы просто разрабатываете это приложение для тестов или в качестве доказательства концепции. Вот рабочее решение, просто добавьте этот метод в свой Date.java класс :
@JsonCreator
public static Date fromDateAsString(String dateString){
Date date = new Date();
date.setDate(dateString);
return date;
}
Идея здесь состоит в том, чтобы помочь Джексону (который является библиотекой, ответственной за десериализацию json в объект Java) создать экземпляр даты из строки, предоставленной в json.
Комментарии:
1. Привет, спасибо, это помогло мне, но теперь я получаю новую ошибку, я обновил свой вопрос. Не могли бы вы помочь мне и с этим тоже? это ошибка: свойство not-null ссылается на нулевое или переходное значение : com.cbc.coorporateblinddateservice.entities.times.Time.meetingDate