Rumah >Java >javaTutorial >Bagaimana untuk melaksanakan pengesahan parameter elegan dalam Java

Bagaimana untuk melaksanakan pengesahan parameter elegan dalam Java

王林
王林ke hadapan
2023-05-19 19:43:042554semak imbas

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

@NotBlank

Semak 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 >

@NotEmpty

Semak 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

@Valid

Sahkan 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

@Emel

Sahkan 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:

Jangan tambahkan gesaan pengecualian yang ditangkap dengan elegan:

Bagaimana untuk melaksanakan pengesahan parameter elegan dalam Java

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!

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