[英]How to using PUT Method with deep-nested children
目前当我需要在深嵌套子中使用PUT方法时,我先删除当前记录,然后保存新记录,我想知道是否有更适合在深嵌套子中使用PUT方法的方法?
如果是这样,你能告诉我一个示例代码吗?
要求
http://localhost:8080/api/v1/step/3
{
"name": "Step1 - record 1 change",
"step2": [
{
"name": "Step2 - record 1 change",
"step3": [
{
"name": "Step3 - record 1 change",
"step4": [
{
"name": "Step4 - record 1 change"
}
]
}
]
}
]
}
替换方法
public Step1 replace(Step1Put step1Put, long id) {
Step1 savedStep1 = findByIdOrBadRequestException(id);
Step1 step1 = StepMapper.INSTANCE.toStep(step1Put);
step1.setId(savedStep1.getId());
//Remove step2 and deep-nested child
List<Step2> step2List = new ArrayList<>();
step1.setStep2(step2List);
step1Rep.save(step1);
//Add new step2 and deep-nested child
List<Step2> strStep2 = step1Put.getStep2();
step2List.addAll(strStep2);
step1.setStep2(step2List);
step1.getStep2().forEach((child) -> child.setStep1(step1));
step1Rep.save(step1);
return step1;
}
我的课程
Controller
@RestController
@RequestMapping("api/v1/step")
@RequiredArgsConstructor
public class StepController {
private final StepService stepService;
@PostMapping
public ResponseEntity<Step1> save (@NotNull @Valid @RequestBody Step1Post step1Post) {
return new ResponseEntity<>(stepService.save(step1Post), HttpStatus.CREATED);
}
@PutMapping("/{id}")
public ResponseEntity<Step1> replace (
@NotNull @Valid @RequestBody Step1Put step1Put,
@PathVariable long id
) {
return ResponseEntity.ok(stepService.replace(step1Put, id));
}
}
服务
@Service
@RequiredArgsConstructor
public class StepService {
private final Step1Rep step1Rep;
public Step1 findByIdOrBadRequestException(long id) {
return step1Rep.findById(id)
.orElseThrow(() -> new RuntimeException("Step not found!"));
}
@Transactional
public Step1 save(Step1Post step1Post){
Step1 step1 = StepMapper.INSTANCE.toStep(step1Post);
List<Step2> strStep2 = step1Post.getStep2();
List<Step2> step2List = new ArrayList<>(strStep2);
step1.setStep2(step2List);
step1.getStep2().forEach((child) -> child.setStep1(step1));
return step1Rep.save(step1);
}
public Step1 replace(Step1Put step1Put, long id) {
Step1 savedStep1 = findByIdOrBadRequestException(id);
Step1 step1 = StepMapper.INSTANCE.toStep(step1Put);
step1.setId(savedStep1.getId());
//Remove step2 and deep-nested child
List<Step2> step2List = new ArrayList<>();
step1.setStep2(step2List);
step1Rep.save(step1);
//Add new step2 and deep-nested child
List<Step2> strStep2 = step1Put.getStep2();
step2List.addAll(strStep2);
step1.setStep2(step2List);
step1.getStep2().forEach((child) -> child.setStep1(step1));
step1Rep.save(step1);
return step1;
}
}
存储库
public interface Step1Rep extends JpaRepository<Step1, Long> {
}
映射器
@Mapper(componentModel = "spring")
public abstract class StepMapper {
public static final StepMapper INSTANCE = Mappers.getMapper(StepMapper.class);
public abstract Step1 toStep(Step1Post step1Post);
public abstract Step1 toStep(Step1Put step1Put);
}
DTO
Step1发布
@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class Step1Post {
private String name;
private List<Step2> step2 = new ArrayList<>();
}
Step1放
@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class Step1Put {
private Long id;
private String name;
private List<Step2> step2 = new ArrayList<>();
}
Model
步骤1
@Entity
@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
@Table(name = "step1")
@JsonIgnoreProperties({"hibernateLazyInitializer", "handler"})
public class Step1 {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
@EqualsAndHashCode.Exclude
@OneToMany(mappedBy = "step1",
cascade = CascadeType.ALL,
orphanRemoval = true,
fetch = FetchType.LAZY)
@JsonManagedReference
private List<Step2> step2 = new ArrayList<>();
}
第2步
@Entity
@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
@Table(name = "step2")
@JsonIgnoreProperties({"hibernateLazyInitializer", "handler"})
public class Step2 {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "step1_id", nullable = false, foreignKey = @ForeignKey(name = "fk_step2_step1"))
@JsonBackReference
private Step1 step1;
private String name;
@EqualsAndHashCode.Exclude
@OneToMany(mappedBy = "step2",
cascade = CascadeType.ALL,
orphanRemoval = true,
fetch = FetchType.LAZY)
@JsonManagedReference
private List<Step3> step3 = new ArrayList<>();
}
第三步
@Entity
@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
@Table(name = "step3")
@JsonIgnoreProperties({"hibernateLazyInitializer", "handler"})
public class Step3 {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "step2_id", nullable = false, foreignKey = @ForeignKey(name = "fk_step3_step2"))
@JsonBackReference
private Step2 step2;
private String name;
@EqualsAndHashCode.Exclude
@OneToMany(mappedBy = "step3",
cascade = CascadeType.ALL,
orphanRemoval = true,
fetch = FetchType.LAZY)
@JsonManagedReference
private List<Step4> step4 = new ArrayList<>();
}
第4步
@Entity
@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
@Table(name = "step4")
@JsonIgnoreProperties({"hibernateLazyInitializer", "handler"})
public class Step4 {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "step3_id", nullable = false, foreignKey = @ForeignKey(name = "fk_step4_step3"))
@JsonBackReference
private Step3 step3;
private String name;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.