Jadual Kandungan
1. Pengenalan
2. Cara mengesahkan parameter dengan elegan
2.1 Panduan Rasmi
2.2 Arahan penggunaan Anotasi
Rumah Java javaTutorial Bagaimana untuk melaksanakan pengesahan parameter elegan dalam Java

Bagaimana untuk melaksanakan pengesahan parameter elegan dalam Java

May 19, 2023 pm 07:43 PM
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");
    }
Salin selepas log masuk

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) {
        ...
    }
 
}
Salin selepas log masuk

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>
Salin selepas log masuk

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;
    }
}
Salin selepas log masuk
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 "测试成功";
    }
 
}
Salin selepas log masuk

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;
    }
 
}
Salin selepas log masuk
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 Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn

Alat AI Hot

Undresser.AI Undress

Undresser.AI Undress

Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover

AI Clothes Remover

Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool

Undress AI Tool

Gambar buka pakaian secara percuma

Clothoff.io

Clothoff.io

Penyingkiran pakaian AI

AI Hentai Generator

AI Hentai Generator

Menjana ai hentai secara percuma.

Artikel Panas

R.E.P.O. Kristal tenaga dijelaskan dan apa yang mereka lakukan (kristal kuning)
3 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Tetapan grafik terbaik
3 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Cara Memperbaiki Audio Jika anda tidak dapat mendengar sesiapa
3 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25: Cara Membuka Segala -galanya Di Myrise
3 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌

Alat panas

Notepad++7.3.1

Notepad++7.3.1

Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina

SublimeText3 versi Cina

Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1

Hantar Studio 13.0.1

Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6

Dreamweaver CS6

Alat pembangunan web visual

SublimeText3 versi Mac

SublimeText3 versi Mac

Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Akar Kuasa Dua di Jawa Akar Kuasa Dua di Jawa Aug 30, 2024 pm 04:26 PM

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

Nombor Sempurna di Jawa Nombor Sempurna di Jawa Aug 30, 2024 pm 04:28 PM

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

Penjana Nombor Rawak di Jawa Penjana Nombor Rawak di Jawa Aug 30, 2024 pm 04:27 PM

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

Weka di Jawa Weka di Jawa Aug 30, 2024 pm 04:28 PM

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

Nombor Smith di Jawa Nombor Smith di Jawa Aug 30, 2024 pm 04:28 PM

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

Soalan Temuduga Java Spring Soalan Temuduga Java Spring Aug 30, 2024 pm 04:29 PM

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

Cuti atau kembali dari Java 8 Stream Foreach? Cuti atau kembali dari Java 8 Stream Foreach? Feb 07, 2025 pm 12:09 PM

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

TimeStamp to Date in Java TimeStamp to Date in Java Aug 30, 2024 pm 04:28 PM

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.

See all articles