使用@RequestParam从UI调用API到后端时,无法使Spring Boot接受有限的参数

时间:2019-12-03 10:39:50

标签: reactjs spring-boot

你好,我正在使用React JS作为UI。

首先,假设我已设计出低于14个值的表格

file
isSameMail
Student_firstName
Student_lastName
Student_Email
Student_details1
Student_details2
Student_details3
Student_details4
Student_details5
Student_details6
Student_details7
Student_details8
Student_details9

我正在使用@RequestParam在Springboot API(registerStudent)中传递上述形式的值,以从UI之类的方式注册学生调用API

 let data = new FormData();
                data.append('file', this.state.file);
                data.append('isSameMail', false);
                data.append('Student_firstName', fields.firstName);
                data.append('Student_lastName', fields.lastName);
                data.append('Student_Email', fields.email);
                data.append('Student_details1', fields.details1);
                data.append('Student_details2', fields.details2);
                data.append('Student_details3', fields.details3);
                data.append('Student_details4', fields.details4);
                data.append('Student_details5', fields.details5);
                data.append('Student_details6', fields.details6);
                data.append('Student_details7', fields.details7);
                data.append('Student_details8', fields.details8);
                data.append('Student_details9', fields.details9);
                const url = http://localhost:8084/student/registerStudent';

                fetch(url, {
                  method: 'POST',
                  body: data,
                })
                  .then(res => {
                    if (res.ok) {
                      return res.json();
                    }
                    throw new Error(res.status);
                  })
                  .then(res => {
                    })

我正在使用spring-boot调用API,是从表单UI中获取所有上述值并将其存储在数据库中(MYSQL)

假设我正在使用API​​调用控制器

@CrossOrigin
 @PostMapping(path = "/student/registerStudent", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
public ResponseEntity<Object> registerStudent(@RequestParam(value = "file", required = false) MultipartFile UploadRegistrationForm,
                                                  @RequestParam("isSameMail") boolean isSameMail, @RequestParam("Student_firstName") String firstName,
                                                  @RequestParam("Student_lastName") String lastName, @RequestParam("Student_Email") String email,
                                                  @RequestParam("Student_details1") String details1, @RequestParam("Student_details2") String details2,
                                                  @RequestParam(value = "Student_details3", required = false) Double details3,
                                                  @RequestParam(value = "Student_details4", required = false) Double details4,
                                                  @RequestParam(value = "Student_details5", required = false) Double details5,
                                                  @RequestParam(value = "Student_details6", required = false) Double details6,
                                                  @RequestParam(value = "Student_details7", required = false) Date details7,
                                                  @RequestParam(value = "Student_details8", required = false) Integer details8,
                                                  @RequestParam(value = "Student_details9", required = false) String details9) throws IOException {
}

现在您可以看到registerStudent()方法中有很多参数,但是由于我不想拥有超过7个参数的参数,除了多次定义RequestParam之外,使用@RequestParam的合适方法是什么。

注意:我们将获得1个多部分文件。

1 个答案:

答案 0 :(得分:0)

如果我对您的理解正确,那么这可能是适合您的解决方案。

您可以创建一个对象,该对象将包含所有字段,并且在控制器方法中看起来很棒。

类似这样的东西:

package com.example;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.web.multipart.MultipartFile;

import javax.validation.constraints.NotNull;
import java.util.Date;

@NoArgsConstructor
@AllArgsConstructor
@Data
public class RegisterStudentReqestedParams {
    private MultipartFile UploadRegistrationForm;
    @NotNull
    private boolean isSameMail;
    @NotNull
    private String firstName;
    @NotNull
    private String lastName;
    @NotNull
    private String email;
    @NotNull
    private String details1;
    @NotNull
    private String details2;
    private Double details3;
    private Double details4;
    private Double details5;
    private Double details6;
    private Date details7;
    private Integer details8;
    private String details9;
}

控制器现在看起来像这样:

@CrossOrigin
    @PostMapping(path = "/student/registerStudent", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
    public ResponseEntity<Object> registerStudent(@RequestBody @Valid RegisterStudentReqestedParams registerStudentReqestedParams){}