Bagaimana untuk melaksanakan pengesahan parameter elegan dalam Java
1. Pengenalan
Untuk mengesahkan parameter kaedah, cara paling mudah dan paling ganas untuk menulisnya adalah seperti ini:
public static void utilA(String a,BigDecimal b){ if (StringUtils.isEmpty(a)){ System.out.println("a不可为空"); return; } if (b == null){ System.out.println("b不可为空"); return; } if (b.compareTo(BigDecimal.ZERO) != 1){ System.out.println("b的取值范围不正确"); return; } System.out.println("do something"); }
Tiada masalah sama sekali dari sudut fungsi pandangan.
Walau bagaimanapun, dari sudut kebolehselenggaraan jangka panjang kod, kadar penggunaan semula kod adalah rendah Apabila terdapat terlalu banyak peraturan pengesahan, ia adalah sukar untuk dikekalkan dan ia kelihatan kekok sedikit mengejar, Da Tuo seperti itu masih agak sukar untuk diterima.
Walaupun terdapat beberapa penyelesaian seperti Prasyarat (com.google), sukar untuk menyesuaikan diri dengan semua senario, dan ia tidak begitu selesa untuk digunakan seperti yang sepatutnya.
2. Cara mengesahkan parameter dengan elegan
Spring secara rasmi mengesyorkan pengesahan peringkat kaedah yang elegan (pengesahan parameter input, pengesahan nilai pulangan) dengan semantik yang jelas
2.1 Panduan Rasmi
Spring rasmi dalam dokumen SpringBoot, penyelesaian yang diberikan untuk pengesahan parameter (Pengesahan) adalah seperti berikut:
@Service @Validated public class MyBean { public Archive findByCodeAndAuthor(@Size(min = 8, max = 10) String code, Author author) { ... } }
dokumen tapak web rasmi SpringBoot "37. Pengesahan"
Dalam erti kata lain , gunakan spesifikasi JSR-303 dan terus gunakan anotasi untuk pengesahan parameter.
(JSR-303 ialah sub-spesifikasi dalam JAVA EE 6, dipanggil Bean Validation, dan pelaksanaan rujukan rasmi ialah Hibernate Validator)
2.2 Arahan penggunaan Anotasi
2.2.1. Pengenalan kepada anotasi
Untuk parameter jenis ringkas (bukan Kacang), gunakan anotasi untuk menambah peraturan kekangan secara langsung sebelum parameter. Anotasi adalah seperti berikut:
@AssertTrue / @AssertFalse
Bidang yang berkenaan pengesahan: boolean
Perihalan anotasi: Sahkan sama ada nilai itu benar / false
@DecimalMax / @DecimalMin
Bidang berkenaan pengesahan: BigDecimal,BigInteger,String,byte,short,int,long
Notasi:Pengesahan: nilai Sama ada kurang daripada atau sama dengan nilai perpuluhan yang ditentukan, sila ambil perhatian bahawa terdapat isu ketepatan dengan perpuluhan
@Digits
Medan yang berkenaan pengesahan: BigDecimal, BigInteger , Rentetan, bait, pendek, int , panjang
Anotasi: Sahkan sama ada komposisi berangka nilai itu sah
Perihalan atribut: integer: menentukan bilangan digit dalam bahagian integer. pecahan: menyatakan bilangan digit dalam bahagian pecahan.
@Future / @Past
Medan yang berkenaan pengesahan: Tarikh, Kalendar
Anotasi: Sahkan sama ada nilai selepas/sebelum masa semasa
Perihalan atribut: Awam
@Max / @Min
Medan yang berkenaan pengesahan: BigDecimal, BigInteger, String, byte, short, int, long
Anotasi: Sahkan sama ada nilai adalah kurang daripada atau sama dengan nilai integer yang ditentukan
Perihalan atribut: Awam
Nota: Adalah disyorkan untuk menggunakan jenis Stirng dan Integer, bukan disyorkan untuk menggunakan jenis int pada, kerana nilai yang diserahkan oleh borang tidak boleh ditukar kepada int apabila ia adalah "" >Perihalan anotasi: Sahkan sama ada nilai itu bukan nol/kosong
Perihalan atribut: Awam
@NotBlankSemak sama ada rentetan kekangan adalah Nol dan sama ada panjang trim adalah Lebih daripada 0, hanya untuk rentetan dan ruang di hadapan dan di belakang akan dialih keluar >
@NotEmptySemak sama ada elemen kekangan adalah Null atau EMPTY.
@NotBlank dan @NotEmpty Difference: Spaces (" ") adalah sah untuk NotEmpty, manakala NotBlank akan membuang pengecualian pengesahan
@Corak
Medan yang berkenaan pengesahan: RentetanAnotasi: Sahkan sama ada nilai dilengkapi dengan ungkapan biasa
Penerangan atribut : regexp: Bendera ungkapan biasa: Tatasusunan yang menentukan Pattern.Flag, mewakili pilihan berkaitan ungkapan biasa.
@Size
Bidang pengesahan yang berkenaan: Rentetan, Koleksi, Peta, Tatasusunan
Anotasi: Sahkan sama ada nilai memenuhi keperluan panjang
Perihalan atribut: maks: menentukan panjang maksimum, min: menentukan panjang minimum.
@Length(min=, max=): Digunakan secara khusus pada jenis Rentetan
@ValidSahkan medan yang berkenaan : Sahkan secara rekursif objek yang berkaitan
Anotasi: Jika objek yang berkaitan ialah koleksi atau tatasusunan, maka elemen di dalamnya akan disahkan secara rekursif Jika ia adalah peta, bahagian nilai akan disahkan (Sama ada untuk lakukan pengesahan rekursif) Perihalan atribut: Tiada
@Julat(min=, maks=) Elemen yang dinyatakan mestilah dalam julat yang sesuai
@CreditCardNumber
Pengesahan kad kredit
@EmelSahkan sama ada ia adalah alamat e-mel Jika ia batal, tiada pengesahan dilakukan dan pengesahan diluluskan.
@URL(protocol=,host=, port=,regexp=, flags=)2.2.2 Gunakan
1. Perkenalkan kebergantungan
<!-- https://mvnrepository.com/artifact/org.hibernate.validator/hibernate-validator --> <dependency> <groupId>org.hibernate.validator</groupId> <artifactId>hibernate-validator</artifactId> <version>6.1.5.Final</version> </dependency>
2 Tambahkan anotasi pada medan yang sepadan Apabila kaedah dipanggil, jika parameter sebenar yang dihantar tidak sepadan dengan peraturan kekangan, ConstraintViolationException akan dilemparkan secara langsung. pengesahan parameter gagal. import javax.validation.constraints.Max;
import javax.validation.constraints.Min;
import javax.validation.constraints.NotEmpty;
/**
* @Author: wangxia
* @Date: 2021/10/20 16:30
*/
public class TestPerson {
@NotEmpty(message = "用户名不能为空")
private String username;
@Min(value = 0,message = "年龄不能小于0岁")
@Max(value =150,message = "年龄不能大于150岁")
private int age;
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
@RequestMapping("/") @RestController public class TestValidatController { @PostMapping("/testValid") public String testValid(@Validated @RequestBody TestPerson testPerson){ return "测试成功"; } }
4. Tangkap pengecualian dengan anggun. Langkah ini boleh diabaikan, tetapi ia akan dikembalikan terus apabila meminta, dengan gesaan 400 pengecualian, yang tidak begitu elegan. Atas ialah kandungan terperinci Bagaimana untuk melaksanakan pengesahan parameter elegan dalam Java. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!@ControllerAdvice
@ResponseBody
public class MethodArgumentNotValidHandel {
@ExceptionHandler(value=MethodArgumentNotValidException.class)
public JSONObject MethodArgumentNotValidHandler(HttpServletRequest request,
MethodArgumentNotValidException exception) throws Exception
{
JSONObject result=new JSONObject();
result.put("code","fail");
JSONObject errorMsg=new JSONObject();
for (FieldError error : exception.getBindingResult().getFieldErrors()) {
errorMsg.put(error.getField(),error.getDefaultMessage());
}
result.put("msg",errorMsg);
return result;
}
}

Alat AI Hot

Undresser.AI Undress
Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover
Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool
Gambar buka pakaian secara percuma

Clothoff.io
Penyingkiran pakaian AI

AI Hentai Generator
Menjana ai hentai secara percuma.

Artikel Panas

Alat panas

Notepad++7.3.1
Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina
Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1
Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6
Alat pembangunan web visual

SublimeText3 versi Mac
Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Topik panas



Panduan untuk Square Root di Java. Di sini kita membincangkan cara Square Root berfungsi di Java dengan contoh dan pelaksanaan kodnya masing-masing.

Panduan Nombor Sempurna di Jawa. Di sini kita membincangkan Definisi, Bagaimana untuk menyemak nombor Perfect dalam Java?, contoh dengan pelaksanaan kod.

Panduan untuk Penjana Nombor Rawak di Jawa. Di sini kita membincangkan Fungsi dalam Java dengan contoh dan dua Penjana berbeza dengan contoh lain.

Panduan untuk Weka di Jawa. Di sini kita membincangkan Pengenalan, cara menggunakan weka java, jenis platform, dan kelebihan dengan contoh.

Panduan untuk Nombor Smith di Jawa. Di sini kita membincangkan Definisi, Bagaimana untuk menyemak nombor smith di Jawa? contoh dengan pelaksanaan kod.

Dalam artikel ini, kami telah menyimpan Soalan Temuduga Spring Java yang paling banyak ditanya dengan jawapan terperinci mereka. Supaya anda boleh memecahkan temuduga.

Java 8 memperkenalkan API Stream, menyediakan cara yang kuat dan ekspresif untuk memproses koleksi data. Walau bagaimanapun, soalan biasa apabila menggunakan aliran adalah: bagaimana untuk memecahkan atau kembali dari operasi foreach? Gelung tradisional membolehkan gangguan awal atau pulangan, tetapi kaedah Foreach Stream tidak menyokong secara langsung kaedah ini. Artikel ini akan menerangkan sebab -sebab dan meneroka kaedah alternatif untuk melaksanakan penamatan pramatang dalam sistem pemprosesan aliran. Bacaan Lanjut: Penambahbaikan API Java Stream Memahami aliran aliran Kaedah Foreach adalah operasi terminal yang melakukan satu operasi pada setiap elemen dalam aliran. Niat reka bentuknya adalah

Panduan untuk TimeStamp to Date di Java. Di sini kita juga membincangkan pengenalan dan cara menukar cap waktu kepada tarikh dalam java bersama-sama dengan contoh.
