Rumah  >  Artikel  >  Java  >  Kaedah untuk pengesahan parameter dalam projek Spring Boot

Kaedah untuk pengesahan parameter dalam projek Spring Boot

PHPz
PHPzke hadapan
2023-05-15 13:58:171632semak imbas

Pemulihan pemandangan

Simulasi senario perniagaan mudah:

Jika anda sedang membuat sistem kemasukan skor sekarang, anda boleh menggunakan rangka kerja Spring BootTulis antara muka bahagian belakang untuk menerima objek Pelajar yang diluluskan daripada penyemak imbas bahagian hadapan dan masukkannya ke dalam pangkalan data bahagian belakang.

Kami mentakrifkan objek Pelajar yang masuk sebagai:

public class Student {
    private String name;    // 姓名
    private Integer score;  // 考试分数(满分100分)
    private String mobile;  // 电话号码(11位)
}

dan kemudian tulis antara muka latar belakang untuk Permintaan siaran untuk menerima objek Pelajar yang dihantar dari halaman web:

@RestController
public class TestController {

    @Autowired
    private StudentService studentService;

    @PostMapping("/add")
    public String addStudent( @RequestBody Student student ) {
        studentService.addStudent( student ); // 将student对象存入数据库
        return "SUCCESS";
    }
}

Pada ketika ini, saya fikir anda pasti telah melihat kelemahan dalam kod di atas, kerana kami tidak melakukan sebarang pengesahan data pada objek Pelajar yang masuk, seperti :

Salah satu daripada tiga medan dalam objek Pelajar telah dilupakan Apakah yang perlu saya lakukan jika ia adalah batal? Bagaimana jika markah pelajar ditulis dengan salah dan ditulis sebagai 101 mata? Apakah yang perlu saya lakukan jika saya salah mengisi nombor telefon bimbit 11 digit pelajar dan menambah satu digit lagi? ...Tunggu

Walaupun data ini biasanya disahkan pada halaman hadapan, sebagai jurutera pembangunan bahagian belakang yang teliti dan teliti, kami pastinya mesti menyemak setiap sekeping data yang masuk menjalani pengesahan ketat, jadi bagaimana kita harus menulisnya?

@PostMapping("/add")
public String addStudent( @RequestBody Student student ) {
    if( student == null )
        return "传入的Student对象为null,请传值";
    if( student.getName()==null || "".equals(student.getName()) )
        return "传入的学生姓名为空,请传值";
    if( student.getScore()==null )
        return "传入的学生成绩为null,请传值";
    if( (student.getScore()<0) || (student.getScore()>100) )
        return "传入的学生成绩有误,分数应该在0~100之间";
    if( student.getMobile()==null || "".equals(student.getMobile()) )
        return "传入的学生电话号码为空,请传值";
    if( student.getMobile().length()!=11 )
        return "传入的学生电话号码长度有误,应为11位";
    studentService.addStudent( student ); // 将student对象存入MySQL数据库
    return "SUCCESS";
}

Saya telah selesai menulis, tetapi saya rasa tangan saya sedikit sakit, dan hati saya sedikit letih Objek Pelajar ini tidak teruk semua, terdapat hanya 3 medan di dalam Jika Apa yang perlu dilakukan jika objek kompleks mempunyai 30 medan? Ia tidak dapat dibayangkan!

Berkat anotasi Tuhan

Malah, rangka kerja Spring telah menggunakan anotasi untuk memberikan kami pelbagai data interaktif sejak versi awalnya kerja, seperti contoh di atas, kami hanya perlu menambah anotasi yang sepadan pada medan kelas entiti Pelajar yang masuk untuk menyelesaikan masalah dengan mudah:

public class Student {
    @NotNull(message = "传入的姓名为null,请传值")
    @NotEmpty(message = "传入的姓名为空字符串,请传值")
    private String name;    // 姓名

    @NotNull(message = "传入的分数为null,请传值")
    @Min(value = 0,message = "传入的学生成绩有误,分数应该在0~100之间")
    @Max(value = 100,message = "传入的学生成绩有误,分数应该在0~100之间")
    private Integer score;  // 分数

    @NotNull(message = "传入的电话为null,请传值")
    @NotEmpty(message = "传入的电话为空字符串,请传值")
    @Length(min = 11, max = 11, message = "传入的电话号码长度有误,必须为11位")
    private String mobile;  // 电话号码
}

Sudah tentu, pada masa yang sama, kami juga Ia adalah perlu menambah anotasi @Valid di pintu masuk objek untuk memulakan pengesahan objek Pelajar yang masuk:

@PostMapping("/add")
public String addStudent( @RequestBody  @Valid Student student ) {
    // 棒棒哒!原先各种繁杂的参数校验工作统统都省了!一行代码不用写
    studentService.addStudent( student ); // 将student对象存入MySQL数据库
    return "SUCCESS";
}

Pada masa ini, jika medan tertentu dimasukkan dengan salah, contohnya, apabila saya memindahkan data, Jika skor disalah laporkan sebagai 101 mata, antara muka mengembalikan keputusan dan butiran ralat akan digesa:

Kaedah untuk pengesahan parameter dalam projek Spring Boot

Sudah tentu, bagi prinsip perkara ini, sejak anotasi digunakan, ia tidak lebih daripada berguna Ia dilaksanakan dengan menggunakan pelbagai renungan dan pengetahuan lain di Jawa yang berminat boleh mengambil peluang ini untuk mempelajarinya.

Pemintasan bersatu bagi anomali data

Kaedah di atas menggunakan anotasi untuk melaksanakan pengesahan data bersatuRasanya sangat bagus, tetapi satu-satunya kelemahan ialah hasilyang dikembalikan terlalu rumit tidak semestinya mempunyai format yang kita perlukan pemprosesan bersatu Contohnya: Saya hanya mahu mengeluarkan mesej ralat untuk pengesahan parameter tertentu. dan kembalikan ke bahagian hadapan.

Untuk tujuan ini, kami mengkonfigurasi projek dengan

pemintas pengecualian bersatu global untuk memformatkan hasil pengembalian semua pengesahan data.

@ControllerAdvice
@ResponseBody
public class GlobalExceptionInterceptor {
  @ExceptionHandler(value = Exception.class)
  public String exceptionHandler(HttpServletRequest request, Exception e) {
    String failMsg = null;
    if (e instanceof MethodArgumentNotValidException) {
      // 拿到参数校验具体异常信息提示
      failMsg = ((MethodArgumentNotValidException) e).getBindingResult().getFieldError().getDefaultMessage();
    }
    return failMsg; // 直接吐回给前端
  }
}

Seperti yang ditunjukkan dalam kod di atas, kami

secara global memintas pengecualian pengesahan parameter MethodArgumentNotValidException, dan hanya mendapatkan maklumat Mesej terperinci yang sepadan dengan pengecualian dan meludahkannya ke hujung hadapan, dan kemudian kembalikannya ke hujung hadapan Data lebih jelas:

Kaedah untuk pengesahan parameter dalam projek Spring Boot

Atas ialah kandungan terperinci Kaedah untuk pengesahan parameter dalam projek Spring Boot. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Artikel ini dikembalikan pada:yisu.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam