1: Dasar-dasar Hibernate-Validator
1. PENDAHULUAN:
Dengan menggunakan anotasi anotasi untuk menambahkan kendala ke atribut kelas atau kelas, periksa legalitas nilai atribut selama runtime.
2. Fungsi:
Verifikasi parameter sangat penting dalam pengembangan antarmuka API, karena klien dapat melewati lebih sedikit parameter, atau nilainya ilegal, atau bahkan nilai parameter berbahaya, sehingga legalitas parameter yang ditransmisikan oleh klien harus diverifikasi. Di antara mereka, anotasi aturan verifikasi nilai parameter ke atribut melalui anotasi adalah cara yang relatif elegan.
3. Anotasi kendala yang biasa digunakan
4. Dapatkan validator hibernate pertama kali
alamat kelas publik {@notnull private string line1; line string private2; zip string pribadi; keadaan string pribadi; @Length (max = 20) @notnull Private String Country; @Range (min = -2, maks = 50, pesan = "lantai di luar jangkauan") lantai int publik; // getter && setter}Dua: mengintegrasikan verifikasi hibernate-validator
Contoh ini diintegrasikan berdasarkan SpringMVC+FastJson Integration (//www.vevb.com/article/139094.htm). Pertama-tama Anda dapat melihat artikel ini (dengan kode sumber untuk diunduh) dan mengintegrasikan hibernate-validator berdasarkan artikel ini.
Langkah Integrasi:
1. Memperkenalkan ketergantungan hibernate-validator di pom.xml
<dependency> <GroupId> org.hibernate </groupid> <ArTifactId> hibernate-validator </artifactid> <version> 5.4.1.Final </version> </dependency>
2. Konfigurasi validator di [xxx] -servlet.xml: hibernatevalidator
<!-<mvc: anotasi-driven> Tambahkan validator atribut validator = "validator"-> <mvc: validator yang digerakkan anotasi = "validator"> <mvc: pesan-konverter register-default = "true"> <!-configure fastjson untuk menggantikan dukungan jackson asli-> <bean> <true "=" <value>text/html;charset=UTF-8</value> <value>application/json</value> </list> </property> <property name="features"> <list> <value>QuoteFieldNames</value> <value>WriteMapNullValue</value> </list> </property> </bean> </mvc:message-converters> </mvc:annotation-driven> <bean id = "validator"> <name properti = "providerclass" value = "org.hibernate.validator.hibernatevalidator"/> <name properti = "validationMessageSource" ref = "messageSource"/</bean> <bean id cute = "pesan sumber"> <nama properti = "baseNames"> </bean> <bean id cute = "pesan pesan"> <nama properti = "BASENAME"> <DAFTAR> <DAFTAR> <BEAN> CONTRIEPATH "CONFORTE <LIST: CONFORTETED: CONTRIATE <LAGE:" BASENAME "> </BEAN> <list> <bean> cute: cute: cute: cute: conforpath"> <listing/</bean> <listing> <listing/<list> <list> <listing> <value> classpath: org/hibernate/validator/validationMessages </ value> </list> </property> <name properti = "usecodeasdefaultMessage" value = "false"/> <properti name = "defaultEncoding" value = "UTF-8"/<Property Name = "Cachesecec" value = "60" 60 "
3. Tentukan pesan verifikasi pesan deskripsi validasi.properties di lokasi SRC/Main/Resources/Conf/Pengaturan
validasi.common.not.null = bidang ini tidak dapat menjadi validasi kosong.common.not.range = panjang validasi ilegal.common.format.error = format kesalahan validasi.param.age = usia di bawah 18 tahun rep.error.unknown = tidak diketahui kesalahan
4. Buat kelas entitas baru untuk pengujian
Userentity
Paket com.mengdee.manage.validator; impor javax.validation.constraints.min; import javax.validation.constraints.notnull; impor javax.validation.constraints.null; import javax.validation.constraints.pattern; impor org.hibernate.validation org.hibernate.validator.constraints.length; impor org.hibernate.validator.constraints.notblank; UserEntity kelas publik {@null (grup = {groupa.class}) @notnull (grup = {groupb.class}) @min (nilai = 1, Nilai ID = "ID" ID harus @NotBlank(groups={GroupA.class, GroupB.class}) @Pattern(regexp="^(?![0-9]+$)(?![a-zA-Z]+$)[0-9A-Za-z]{6,20}$", message="Composition of 6-21 letters and numbers, cannot be pure numbers or pure English", groups={GroupA.class, Groupb.class}) kata sandi string pribadi; @Notblank (grup = {groupa.class, groupb.class}) @pattern (regexp = "^((13 [0-9]) | (15 [^4, // d]) | (18 [0,3-9]) // d {8} $", pesan = "Format nomor ponsel tidak ada hubungannya"). @Notblank (grup = {groupb.class}) @length (min = 6, maks = 12, pesan = "Panjang nama panggilan adalah 6 hingga 12 bit") nama panggilan string pribadi; @Min (value = 18, message = "{validation.param.age}") private int usia; @Notblank (grup = {groupa.class}) @email (message = "{validation.common.format.error}") email string pribadi; @Notblank @length (min = 3, max = 10, message = "{validation.common.not.range}") Private String username; UserEntity public () {} public long getId () {return id; } public void setId (Long ID) {this.id = id; } public string getNickName () {return nickname; } public void setNickName (nickname string) {this.nickname = nickName; } public int getage () {usia kembali; } public void setage (int usia) {this.age = usia; } public String geteMail () {return email; } public void seteMail (string email) {this.email = email; } public string getPassword () {return kata sandi; } public void setPassword (kata sandi string) {this.password = kata sandi; } public string getUserName () {return username; } public void setusername (string username) {this.username = username; } public string getPhone () {return phone; } public void setPhone (string phone) {this.phone = phone; }}Usermodel
Paket com.mengdee.manage.validator; impor javax.validation.constraints.min; impor javax.validation.constraints.pattern; impor org.hibernate.validator.constraints.email; Impor org.hibernate.validator.constraints.lengthing; Impor -uNGERM.CURNATEC.CURNATEC.CURNATE.CONDATOR.Constraints. {@Min (nilai = 1, pesan = "Nilai id harus lebih besar dari 0") Private Long ID; @Notblank @length (min = 6, maks = 12, pesan = "Panjang nama panggilan adalah 6 hingga 12 digit") nama panggilan string pribadi; @Min (value = 18, message = "{validation.param.age}") private int usia; @Notblank @email (message = "{validation.common.format.error}") email string pribadi; @Notblank @pattern (regexp = "^(?! [0-9]+$) (?! [A-ZA-Z]+$) [0-9A-ZA-Z] {6,20} $", pesan = "Komposisi 6-21 huruf dan angka, tidak dapat menjadi nomor murni atau bahasa Inggris murni") Kata sandi string pribadi; @Notblank @length (min = 3, max = 10, message = "{validation.common.not.range}") Private String username; @Notblank @pattern (regexp = "^((13 [0-9]) | (15 [^4, // d]) | (18 [0,3-9])) // D {8} $", pesan = "Format nomor ponsel tidak benar") Telepon string pribadi; Usermodel publik () {} public long getId () {return id; } public void setId (Long ID) {this.id = id; } public string getNickName () {return nickname; } public void setNickName (nickname string) {this.nickname = nickName; } public int getage () {usia kembali; } public void setage (int usia) {this.age = usia; } public String geteMail () {return email; } public void seteMail (string email) {this.email = email; } public string getPassword () {return kata sandi; } public void setPassword (kata sandi string) {this.password = kata sandi; } public string getUserName () {return username; } public void setusername (string username) {this.username = username; } public string getPhone () {return phone; } public void setPhone (string phone) {this.phone = phone; }}UserDetail:
Paket com.mengdee.manage.validator; impor org.hibernate.validator.constraints.notblank; kelas publik userDetail {private long id; @Notblank alamat string pribadi; @NotBlank Private String Company; Public UserDetail () {} public long getId () {return id; } public void setId (Long ID) {this.id = id; } public String getAddress () {alamat kembali; } public void setAddress (Alamat String) {this.address = alamat; } public String getCompany () {return company; } public void setCompany (string company) {this.company = company; }}Pengujian dengan Controller yang valid
Paket com.mengdee.manage.controller; import javax.servlet.http.httpservletrequest; impor javax.validation.valid; impor org.springframework.stereotype.controller; impor org.springframework.validation.bindingresule; org.springframework.validation.fielderror; impor org.springframework.web.bind.annotation.requestmapping; impor org.springframework.web.bind.annotation.restmethod; impor org.springframework.bind.notation.nrequestmethod; org.springframework.bind.annotation.notation com.mengdee.manage.validator.usermodel;@controller@requestMapping ("/valid") Public Class ValidController memperluas Basecontroller {// http: // localhost: 8081/platform-springmvc-webapp/valid/test? usia=18&nickname=mengdee&id=1&[email protected]&password=root123&userName=123&phone=1832175587 @RetMPRETMORT =Phone=&Phone=18321758957 @RetMPRETMORT= " @ResponseBody Object Validasi (permintaan httpservletRequest, @valid userModel pengguna, BINDINGRESULT BINDINGRESULT) {if (BINDINGRESULT.HASERRORS ()) {fielderror fielderror = bindingResult.getFielderRor (); return super.responseJsonerror (fielderror); } return "ok"; } // Metode untuk memverifikasi banyak objek pada saat yang sama membutuhkan mengikat beberapa hasil mengikat Hasil. A @Valid muncul, yang sesuai dengan pengikat yang dinyatakan kemudian. @RequestMapping (value = "/test2", Method = requestMethod.get) public @ResponseBody Object ValidationMore (httpservletrequest request, @valid userModel pengguna, BINDINGRESULT BINDINGRESULT, @VALID USERDetail UserDetail, BINDINGRESULT BINDINGRESULT2 Fielderror fielderror = bindingresult.getFielderRor (); return super.responseJsonerror (fielderror); } if (bindingResult2.haserrors ()) {fielderror fielderror = bindingResult2.getFielderRor (); return super.responseJsonerror (fielderror); } return "ok"; }}Catatan Penggunaan:
1. Untuk beberapa bidang, urutan verifikasi sistem tampaknya berbeda dari urutan deklarasi lapangan, seolah -olah tidak perlu.
2. Untuk setiap verifikasi, jika tidak ada atribut pesan, sistem akan menggunakan default, seperti @notblank yang sesuai adalah setara dengan @notblank (pesan = "tidak bisa kosong")
3. Untuk jenis referensi seperti string, Anda harus menggunakannya bersamaan dengan @notnull, @notempty atau @notblank. Jika Anda tidak menulis kendala kosong, setelah pengujian, bidang ini tidak akan berpartisipasi dalam verifikasi. Jika Anda menggunakan @pattern, @length, @email, dll. Sendiri, itu tidak akan diverifikasi. Anda harus menggunakan kendala kosong untuk membatasi.
@Min: Digunakan untuk tipe data dasar, seperti int, long, dll.
@Notnull: Nilai objek apa pun tidak bisa nol
@NotEmpty: Elemen dari objek koleksi bukan 0, yaitu, koleksi tidak kosong, dan juga dapat digunakan untuk string bukan nol
@Notblank: Ini hanya dapat digunakan untuk string bukan nol, dan panjang trim string () akan lebih besar dari 0
Tiga: Verifikasi Grup @Validasi
1. Peran Pengelompokan (Gunakan Skenario):
Setiap kendala anotasi verifikasi memiliki atribut grup, yang digunakan untuk menentukan kelompok mana kendala milik. Dengan cara ini, beberapa set kendala dapat dikonfigurasi pada bidang yang sama. Saat menggunakannya, Anda hanya perlu menentukan set kendala mana yang akan digunakan. Misalnya, saat mendaftarkan pengguna dan memodifikasi informasi pengguna, ID harus kosong saat mendaftar, dan ID tidak boleh kosong saat memodifikasi informasi pengguna. Saat menggunakannya, Anda hanya perlu menetapkan dua kendala ini untuk kelompok yang berbeda. Misalnya, saat menambahkan, menggunakan kendala grup A, dan menggunakan kendala grup B saat memperbarui.
2. Paket adalah antarmuka kosong
Groupa dan Groupb
Paket com.mengdee.manage.validator; antarmuka publik groupa {} paket com.mengdee.manage.validator; antarmuka publik groupb {}Saat menggunakan @validasi ({groupa.class})
3. Urutan grup @groupeSequence
Secara default, verifikasi kendala dari kelompok yang berbeda tidak berurutan, dan urutan grup diverifikasi secara berurutan dalam grup sebelum dan sesudah pesanan, seperti pertama memverifikasi kendala grup groupa, dan kemudian memverifikasi kendala grup GroupB. Jika ada persyaratan untuk urutan verifikasi grup, misalnya, Anda harus terlebih dahulu memverifikasi grup A dan kemudian memverifikasi grup B, Anda dapat menggunakan @groupequence untuk menentukan urutan masing -masing grup
Gunakan skenario:
(1) Verifikasi kendala dalam kelompok kedua bergantung pada keadaan stabil untuk dijalankan, dan keadaan stabil ini diverifikasi oleh kelompok pertama.
(2) Verifikasi kelompok tertentu memakan waktu, dan laju penggunaan CPU dan memori relatif besar. Pilihan terbaik adalah menempatkannya terakhir untuk verifikasi. Oleh karena itu, ketika melakukan verifikasi kelompok, metode verifikasi tertib masih diperlukan, yang mengusulkan konsep urutan kelompok.
Suatu kelompok dapat didefinisikan sebagai urutan kelompok lain, dan harus mematuhi urutan yang ditentukan dalam urutan saat digunakan untuk verifikasi. Saat menggunakan verifikasi urutan grup, jika verifikasi grup sebelum urutan gagal, grup selanjutnya tidak akan lagi divalidasi.
Tentukan Urutan Grup Menggunakan Anotasi GroupSequence: Groupab
Paket com.mengdee.manage.validator; import javax.validation.groupequence; @groupequence ({groupa.class, groupb.class}) antarmuka publik groupab {ValidationController
Paket com.mengdee.manage.controller; impor javax.servlet.http.httpservletrequest; impor org.springframework.stereotype.controller; impor org.springframework.validation.bindingResult; impor org.springfringframework.validation org.springframework. com.mengdee.manage.validator.groupa; import com.mengdee.manage.validator.groupab; impor com.mengdee.manage.validator.groupb; impor com.mengdee.manage.validator.userentity;@controller@requestMapping ("/validated") validor COMPLOCERTITION; ditentukan selama verifikasi, sehingga hanya kendala yang berisi groupa yang diperiksa. Jika tidak ada inklusi, tidak akan ada verifikasi. Misalnya, untuk telepon, grup yang ditentukan oleh @NotBlank, dan @Pattern tidak menentukan grup, maka hanya satu kendala yang diperiksa kosong, dan format nomor ponsel tidak diperiksa // http: // localhost: 8081/platform-springmvc-webapp/validasi/grupa? Kata sandi = root123 & telepon = 123 @123. " RequestMethod.get) public @ResponseBody objek groupa (httpservletRequest request, @valideded ({groupa.class}) pengguna Userentity, BINDINGRESULT BINDINGRESULT) {if (BINDINGRESULT.HASERRORS ()) {fielderror fielderror = BIndResult. kembalikan this.responseJsonError (fielderror); } return "ok"; } // http: // localhost: 8081/platform-springmvc-webapp/validasi/groupb? Telepon = 123 & kata sandi = root123 & id = 1 @requestmapping (value = "/groupb", Method = requestMethod.get) @responSeBody objek groupb (httpservetreVer.VETICED.geted @ResponSeBody objek groupB (httpservin.verRass @ResponSeBody objek groupB (httpservetRaSerServeTity @ResponSeBody Objek groupB (httpservetRaSers Pengguna, BINDINGRESULT BINDINGRESULT) {if (BINDINGRESULT.HASERRORS ()) {fielderror fielderror = bindingResult.getFielderRor (); kembalikan this.responseJsonError (fielderror); } return "ok"; } // groupAB // http://localhost:8081/platform-springmvc-webapp/validated/groupAB?phone=111&password=root123&nickname=123&[email protected] // @Validated({GroupA.class, GroupB.class}): The relationship between GroupA and GroupB is or, just like the OR in the database. Selama satu kondisi terpenuhi, kendala akan diverifikasi. Gunakan banyak grup secara bersamaan untuk dicatat bahwa tidak ada atribut dalam urutan antara beberapa grup. It is not to first verify group A and then verify group B. // Because the constraints of id are empty and non-empty are checked, the attribute is commented out first @RequestMapping(value = "/groupAB", method = RequestMethod.GET) public @ResponseBody Object groupAB(HttpServletRequest request, @Validated({GroupA.class, GroupB.class}) UserEntity user, BINDINGRESULT BINDINGRESULT) {if (BINDINGRESULT.HASERRORS ()) {fielderror fielderror = bindingResult.getFielderRor (); kembalikan this.responseJsonError (fielderror); } return "ok"; } // default // http: // localhost: 8081/platform-springmvc-webapp/default? [email protected]&age=18 // @validasi jika grup tidak ditentukan, verifikasi bahwa tidak ada atribut grup (sama dengan fungsi @valid pada saat ini). Jika ada beberapa kendala di bidang, tidak ada grup yang harus ditentukan. If the specified group is partially constrained and partial constraints do not specify the constraint, then @RequestMapping(value = "/default", method = RequestMethod.GET) is not checked when using @Validated @ResponseBody Object defaultGroup(HttpServletRequest request, @Validated UserEntity user, BindingResult bindingResult){ if (BINDINGRESULT.HASERRORS ()) {fielderror fielderror = bindingResult.getFielderRor (); kembalikan this.responseJsonError (fielderror); } return "ok"; } // LocalHost: 8081/platform-springmvc-webapp/validasi/urutan? Telepon = 123 & kata sandi = root123 & email = 123 & julukan = 123 // Untuk beberapa kendala pada properti, dan beberapa kendala tidak ada dalam grup yang sama, urutan yang diperiksa @"Nilai @" Nilai @"Nilai @" Nilai yang sama "Nilai @" Nilai @"Nilai Urutan @" Nilai @ RequestMethod.GET) public @ResponseBody Object sequence(HttpServletRequest request, @Validated({GroupAB.class}) UserEntity user, BindingResult bindingResult){ if (bindingResult.hasErrors()) { FieldError fieldError = bindingResult.getFieldError(); kembalikan this.responseJsonError (fielderror); } return "ok"; }}Empat: Anotasi Validasi Hibernate Kustom
Ketika anotasi yang diberikan oleh validasi hibernasi tidak dapat memenuhi persyaratan, Anda dapat menyesuaikan kendala verifikasi.
Langkah -langkah Kendala Anotasi Kustom:
Buat anotasi @phone
Paket com.mengdee.manage.validator; impor java.lang.annotation.target; impor javax.validation.constraint; impor javax.validation.payload; impor static java.lang.annotation.elementype.annotation_type; impor static static java.Lang.Lang. java.lang.annotation.elementtype.field; impor statis java.lang.annotation.elementType.method; impor statis java.lang.annotation.elementtype.parameter; impor statis java.lang.annotation.RetentionPolicy.runtime; impor java.lang.lang.Lang.Dang. java.lang.annotation.Retention; @Target ({Method, field, annotation_type, konstruktor, parameter})@retensi (runtime)@didokumentasikan@kendala (validatedby = {phoneconstraint.class}) public @interface phone {string pesan () default "phoneconstraint" public {string pesan () Default "Ponsel Format Nomor Ponsel"; String regexp () default "^((13 [0-9]) | (15 [^4, // d]) | (18 [0,3-9])) // d {8} $"; Kelas <?> [] Grup () default {}; Kelas <? Extends payload> [] payload () default {}; @Target ({Method, field, annotation_type, konstruktor, parameter}) @retention (runtime) @documented public @interface list {phone [] value (); }}Buat kelas verifikasi kendala yang sesuai dengan anotasi nomor ponsel
Paket com.mengdee.manage.validator; impor javax.validation.constraintvalidator; impor javax.validation.constraintvalidatorContext; kelas publik PhoneConstraint mengimplementasikan ConceptValidator <phone, string> {private string regegexp; @Override public void initialize (phoneannotation) {this.regexp = phoneannotation.regexp (); } @Override public boolean isValId (nilai string, conceptValidatorContext konteks) {if (value == null) {return true; // HV000028: Pengecualian tak terduga selama panggilan isValid} if (value.matches (regexp)) {return true; } return false; }}Gunakan anotasi @phone pada atribut
Paket com.mengdee.manage.validator; import org.hibernate.validator.constraints.notblank; kelas publik userDetail {@notblank @phone Private String Phone; UserDetail public () {} public string getPhone () {return phone; } public void setPhone (string phone) {this.phone = phone; }}Catatan tes
// http://localhost:8081/platform-springmvc-webapp/Valid/test3?address=123&company=456&phone=123 @RequestMapping(value = "/test3", method = RequestMethod.GET) public @ResponseBody Object validationCustomAnnotation(HttpServletRequest request, @Valid UserDetail userDetail, BINDINGRESULT BINDINGRESULT) {if (BINDINGRESULT.HASERRORS ()) {fielderror fielderror = bindingResult.getFielderRor (); return super.responseJsonerror (fielderror); } return "ok"; }Unduh kode lengkap: http://xiazai.vevb.com/201804/yuanma/platform-springmvc-webapp(vevb.com).rar
Meringkaskan
Di atas adalah seluruh konten artikel ini. Saya berharap konten artikel ini memiliki nilai referensi tertentu untuk studi atau pekerjaan semua orang. Jika Anda memiliki pertanyaan, Anda dapat meninggalkan pesan untuk berkomunikasi. Terima kasih atas dukungan Anda ke wulin.com.
Artikel referensi: