Rumah >Java >javaTutorial >Bagaimana untuk melaksanakan pengesahan parameter elegan dalam Java
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.
Spring secara rasmi mengesyorkan pengesahan peringkat kaedah yang elegan (pengesahan parameter input, pengesahan nilai pulangan) dengan semantik yang jelas
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.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;
}
}
3.. Untuk parameter jenis Bean, tambah anotasi kekangan pada setiap medan di dalam Bean, dan kemudian tambah anotasi @Validated atau @Valid di hadapan parameter kaedah. Contoh:
@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. @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;
}
}
Tambahkan gesaan pengecualian yang ditangkap dengan 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!