spring-data-jpa Java Sping Boot 休息:如何传递另一个保存对象,并将另一个对象作为属性?

tnkciper  于 2022-11-10  发布在  Spring
关注(0)|答案(1)|浏览(117)

我正在尝试保存一个对象评级,其中有另一个移动的,所以它包括一个等级和一个手机。
下面是移动的实体:

@Entity
@NoArgsConstructor
@AllArgsConstructor
@Data
public class Mobile {

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;

private String name;

private double price;
}

这里是评级实体

@Entity
@NoArgsConstructor
@AllArgsConstructor
@Data
public class Rating {

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;

@ManyToOne
private Mobile mobile;

private int grade;
}

RatingService类中的方法saveRating

public Rating saveRating(Rating rating) {

Rating theRating = new Rating();
Mobile theMobile = mobileRepo.getById(rating.getMobile().getId());

theRating.setGrade(rating.getGrade());
theRating.setMobile(theMobile);

return ratingRepo.save(theRating);
}

和方法,用于在休息控制器中保存

@Autowired
private RatingService ratingService;

@RequestMapping(value = "/rating", method = RequestMethod.POST)
public Rating newRating(@RequestBody Rating rating){
return ratingService.saveRating(rating);
}

我有所有的@Service @RestController @Autowired注解。其他的工作包括保存移动的,删除和查看它,甚至查看我手动添加到数据库中的评级。我已经尝试在控制器和RatingService中改变newRating方法,它只获取移动设备ID和等级,然后通过mobileRepository找到移动设备并将其保存为移动设备进行评级,但我没有取得进展。所以我又回到了这个方法,从女巫我已经开始了。它似乎很简单做到这一点,但目前还不是。这里是 Postman 的结果:This is from postman

koaltpgm

koaltpgm1#

目前,您正尝试将值“移动的”=1、“rating”=4Map到具有字段“id”、“mobile”(非整数)和“grade”的示例,因此您会收到Bad Request的响应,因为提供的JSON与指定的(@RequestBody)Java类型不匹配。
您可以引入以下dto,而不是将实体用作DataTransferObjects

@Data
public class RatingDto {
    private int mobileId;
    private int grade;
}

然后,您的请求还应在名为mobileId的字段中包含移动的的ID,以匹配dto。
您的控制器端点将如下所示:

private Rating tryMap(RatingDto dto) {
    var mobileId = dto.getMobileId();
    var mobile = mobileRepo.findById(mobileId)
                           .orElseThrow(() -> 
                 new IllegalArgumentException("Mobile with id " + mobileId + "could not be found.");
    var rating = new Rating();
    rating.setGrade(dto.getGrade);
    rating.setMobile(mobile);
    return rating;
}

@PostMapping(value = "/rating")
public Rating newRating(@RequestBody RatingDto dto) {
    var rating = tryMap(dto);
    return ratingService.saveRating(rating);
}

相关问题