从前端发送后,数据将作为空值发送到数据库
Data is being sent to database as null after sending from frontend
我正在尝试在 Event
和 User
实体之间建立联系,以便我可以将参赛者保存到活动中。我以前从未使用过 @ManyToMany
映射,所以一直在学习教程。当我尝试通过 postman(eventid
和 userid
)post 数据时,我得到了两者的空值。
到目前为止,我有用户和事件实体,
@Data
//Entity maps object to database
@Entity
@NoArgsConstructor
@Table(name = "member")
public class User implements UserDetails, Serializable {
//More fields
//Relationship between user and events to get entrants
@OneToMany(mappedBy = "userid", fetch = FetchType.LAZY)
Set<Entrants> entrants;
@Data
//Entity maps object to database
@Entity
@NoArgsConstructor
@Table(name = "event")
public class Event implements Serializable {
//More fields
//Relationship with event and users for entrants to an event
@OneToMany(mappedBy = "eventid",fetch = FetchType.LAZY)
Set<Entrants> entrants;
然后我有一个参赛者实体来保存参赛者参加活动。
@Entity
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Entrants implements Serializable {
@Id
@GeneratedValue
Long id;
@ManyToOne
@JoinColumn(name = "user_id")
User userid;
@ManyToOne
@JoinColumn(name = "event_id")
Event eventid;
}
然后在我的控制器中,
@PostMapping("/management/events/entrants")
GenericResponse createEntrant(@Valid @RequestBody Entrants entrant) {
System.out.println("entrant is: " +entrant);
entrantService.save(entrant);
return new GenericResponse("Entrant saved");
}
参赛者服务
public Entrants save(Entrants entrants) {
return entrantRepository.save(entrants);
}
存储库是标准的,上面使用了 save() 方法。
如果我在Postman中post以下,
{
"user_id": 1,
"event_id": 1
}
我明白了
entrant is: Entrants(id=null, userid=null, eventid=null)
id
显然是由 Spring 创建的,但是 userid
和 eventid
是空的。
据我所知,我认为这与 Entrants
实体中的 2 个字段有关,属于 User
和 Event
类型,而不是 int
.但我不确定如何解决这个问题。
我遵循的教程并非真正基于我的实现,因此我不得不进行很多更改。
您可以像这样在控制器中使用 Dto:
@PostMapping("/management/events/entrants")
createEntrant(@Valid @RequestBody EntrantDto entrant) {
System.out.println("entrant is: " +entrant);
entrantService.save(entrant);
return new GenericResponse("Entrant saved");
}
EntrantDto.java
public class EntrantDto {
private Long user_id;
private Long event_id;
// no-args constructor, getter, setter,...
}
并像
那样稍微修改一下您的服务
public Entrants save(EntrantDto entrant) {
User user = this.userRepository.findById(entrant.getUser_id()).orElseThrown(IllegalArgumentException::new);
Event event = this.eventRepository.findById(entrant.getEvent_id()).orElseThrown(IllegalArgumentException::new);
Entrants entrants = new Entrants(user, event);
return entrantRepository.save(entrants);
}
我正在尝试在 Event
和 User
实体之间建立联系,以便我可以将参赛者保存到活动中。我以前从未使用过 @ManyToMany
映射,所以一直在学习教程。当我尝试通过 postman(eventid
和 userid
)post 数据时,我得到了两者的空值。
到目前为止,我有用户和事件实体,
@Data
//Entity maps object to database
@Entity
@NoArgsConstructor
@Table(name = "member")
public class User implements UserDetails, Serializable {
//More fields
//Relationship between user and events to get entrants
@OneToMany(mappedBy = "userid", fetch = FetchType.LAZY)
Set<Entrants> entrants;
@Data
//Entity maps object to database
@Entity
@NoArgsConstructor
@Table(name = "event")
public class Event implements Serializable {
//More fields
//Relationship with event and users for entrants to an event
@OneToMany(mappedBy = "eventid",fetch = FetchType.LAZY)
Set<Entrants> entrants;
然后我有一个参赛者实体来保存参赛者参加活动。
@Entity
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Entrants implements Serializable {
@Id
@GeneratedValue
Long id;
@ManyToOne
@JoinColumn(name = "user_id")
User userid;
@ManyToOne
@JoinColumn(name = "event_id")
Event eventid;
}
然后在我的控制器中,
@PostMapping("/management/events/entrants")
GenericResponse createEntrant(@Valid @RequestBody Entrants entrant) {
System.out.println("entrant is: " +entrant);
entrantService.save(entrant);
return new GenericResponse("Entrant saved");
}
参赛者服务
public Entrants save(Entrants entrants) {
return entrantRepository.save(entrants);
}
存储库是标准的,上面使用了 save() 方法。
如果我在Postman中post以下,
{
"user_id": 1,
"event_id": 1
}
我明白了
entrant is: Entrants(id=null, userid=null, eventid=null)
id
显然是由 Spring 创建的,但是 userid
和 eventid
是空的。
据我所知,我认为这与 Entrants
实体中的 2 个字段有关,属于 User
和 Event
类型,而不是 int
.但我不确定如何解决这个问题。
我遵循的教程并非真正基于我的实现,因此我不得不进行很多更改。
您可以像这样在控制器中使用 Dto:
@PostMapping("/management/events/entrants")
createEntrant(@Valid @RequestBody EntrantDto entrant) {
System.out.println("entrant is: " +entrant);
entrantService.save(entrant);
return new GenericResponse("Entrant saved");
}
EntrantDto.java
public class EntrantDto {
private Long user_id;
private Long event_id;
// no-args constructor, getter, setter,...
}
并像
那样稍微修改一下您的服务public Entrants save(EntrantDto entrant) {
User user = this.userRepository.findById(entrant.getUser_id()).orElseThrown(IllegalArgumentException::new);
Event event = this.eventRepository.findById(entrant.getEvent_id()).orElseThrown(IllegalArgumentException::new);
Entrants entrants = new Entrants(user, event);
return entrantRepository.save(entrants);
}