Table of Contents
1. Introduction
2. How to verify parameters elegantly
2.1 Official guidance
2.2 Annotation usage instructions
Home Java javaTutorial How to implement elegant parameter verification in Java

How to implement elegant parameter verification in Java

May 19, 2023 pm 07:43 PM
java

1. Introduction

To verify the parameters of the method, the simplest and most violent way to write it is like this:

    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");
    }

There is no problem at all from a functional point of view.

But from the perspective of long-term maintainability of the code, the code reuse rate is low. Once there are too many verification rules, it is difficult to maintain, and it looks clumsy. For engineers with a little pursuit, such a Da Tuo is still quite difficult to accept.

Although there are some solutions such as Preconditions (com.google), it is difficult to adapt to all scenarios, and it is not as comfortable to use as it should be.

2. How to verify parameters elegantly

Spring officially recommends elegant method-level verification with clear semantics (input parameter verification, return value verification)

2.1 Official guidance

Spring official in the SpringBoot document, the solution given for parameter verification (Validation) is as follows:

@Service
@Validated
public class MyBean {
 
    public Archive findByCodeAndAuthor(@Size(min = 8, max = 10) String code,
            Author author) {
        ...
    }
 
}

Spring Boot official website document "37. Validation"

In other words, use the JSR-303 specification and directly use annotations for parameter verification.

(JSR-303 is a sub-standard in JAVA EE 6, called Bean Validation, and the official reference implementation is Hibernate Validator)

2.2 Annotation usage instructions

2.2.1. Introduction to annotations

For simple type parameters (non-Bean), use annotations to add constraint rules directly before the parameters. The annotations are as follows:

@AssertTrue / @AssertFalse

Verification applicable fields: boolean

Annotation description: Verify whether the value is true/false

@DecimalMax / @DecimalMin

Validation applicable fields: BigDecimal, BigInteger, String, byte, short, int, long

Annotation: Validation value Whether it is less than or equal to the specified decimal value, please note that there are precision issues with decimals

@Digits

Verification applicable fields: BigDecimal, BigInteger, String, byte, short, int ,long

Annotation: Verify whether the numerical composition of the value is legal

Attribute description: integer: Specifies the number of digits in the integer part. fraction: specifies the number of digits in the fractional part.

@Future / @Past

Validation applicable fields: Date, Calendar

Annotation: Verify whether the value is after/before the current time

Property Description: Public

@Max / @Min

Validation applicable fields: BigDecimal, BigInteger, String, byte, short, int, long

Annotation: Verify whether the value is less than or equal to the specified integer value

Attribute description: Public

Note: It is recommended to use Stirng, Integer type, not recommended to use int type on, because the value submitted by the form cannot be converted to int

@NotNull / @Null

Validation applicable fields: reference data type

Annotation description: Verify whether the value is non-null/empty

Attribute description: Public

@NotBlank Check whether the constraint string is Null and whether the length of the trimmed string is Greater than 0, only for strings, and the leading and trailing spaces will be removed.

@NotEmpty Check whether the constraint element is Null or EMPTY.

@NotBlank and @NotEmpty Difference: Spaces (" ") are legal for NotEmpty, while NotBlank will throw a verification exception

@Pattern

Validation applicable fields: String

Annotation: Verify whether the value is equipped with a regular expression

Attribute description: regexp:regular expression flags: an array specifying Pattern.Flag, representing the related options of the regular expression.

@Size

Verification applicable fields: String, Collection, Map, Array

Annotation: Verify whether the value meets the length requirement

Attribute description: max: specifies the maximum length, min: specifies the minimum length.

@Length(min=, max=): Specially applied to String type

@Valid

Verification applicable fields : Recursively verify the associated object

Note: If the associated object is a collection or array, then the elements in it are verified recursively. If it is a map, the value part is verified. (Whether to perform recursive verification)

Attribute description: None

@Range(min=, max=) The specified element must be within the appropriate range

@CreditCardNumberCredit Card Verification

@Email Verify whether it is an email address. If it is null, no verification is performed and the verification is passed.

@URL(protocol=,host=, port=,regexp=, flags=)

2.2.2 Use

1. Introduce dependencies

 <!-- 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. Add annotations on the corresponding fields. When the method is called, if the actual parameters passed in do not match the constraint rules, a ConstraintViolationException will be thrown directly, indicating that the parameter verification failed.

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.. For Bean type parameters, add constraint annotations on each field inside the Bean, and then add @Validated or @Valid annotations in front of the method parameters. Example:

@RequestMapping("/")
@RestController
public class TestValidatController {
 
    @PostMapping("/testValid")
    public String testValid(@Validated @RequestBody TestPerson testPerson){
        return "测试成功";
    }
 
}

4. Catch exceptions gracefully. This step can be omitted, but it will be returned directly when requesting, with a 400 exception prompt, which is not very elegant.

@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;
    }
 
}

Add elegantly captured exception prompt:

How to implement elegant parameter verification in Java

Not add elegantly captured exception prompt:

How to implement elegant parameter verification in Java

The above is the detailed content of How to implement elegant parameter verification in Java. For more information, please follow other related articles on the PHP Chinese website!

Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn

Hot AI Tools

Undress AI Tool

Undress AI Tool

Undress images for free

Undresser.AI Undress

Undresser.AI Undress

AI-powered app for creating realistic nude photos

AI Clothes Remover

AI Clothes Remover

Online AI tool for removing clothes from photos.

Clothoff.io

Clothoff.io

AI clothes remover

Video Face Swap

Video Face Swap

Swap faces in any video effortlessly with our completely free AI face swap tool!

Hot Tools

Notepad++7.3.1

Notepad++7.3.1

Easy-to-use and free code editor

SublimeText3 Chinese version

SublimeText3 Chinese version

Chinese version, very easy to use

Zend Studio 13.0.1

Zend Studio 13.0.1

Powerful PHP integrated development environment

Dreamweaver CS6

Dreamweaver CS6

Visual web development tools

SublimeText3 Mac version

SublimeText3 Mac version

God-level code editing software (SublimeText3)

What is a deadlock in Java and how can you prevent it? What is a deadlock in Java and how can you prevent it? Aug 23, 2025 pm 12:55 PM

AdeadlockinJavaoccurswhentwoormorethreadsareblockedforever,eachwaitingforaresourceheldbytheother,typicallyduetocircularwaitcausedbyinconsistentlockordering;thiscanbepreventedbybreakingoneofthefournecessaryconditions—mutualexclusion,holdandwait,nopree

How to use Optional in Java? How to use Optional in Java? Aug 22, 2025 am 10:27 AM

UseOptional.empty(),Optional.of(),andOptional.ofNullable()tocreateOptionalinstancesdependingonwhetherthevalueisabsent,non-null,orpossiblynull.2.CheckforvaluessafelyusingisPresent()orpreferablyifPresent()toavoiddirectnullchecks.3.Providedefaultswithor

Java Persistence with Spring Data JPA and Hibernate Java Persistence with Spring Data JPA and Hibernate Aug 22, 2025 am 07:52 AM

The core of SpringDataJPA and Hibernate working together is: 1. JPA is the specification and Hibernate is the implementation, SpringDataJPA encapsulation simplifies DAO development; 2. Entity classes map database structures through @Entity, @Id, @Column, etc.; 3. Repository interface inherits JpaRepository to automatically implement CRUD and named query methods; 4. Complex queries use @Query annotation to support JPQL or native SQL; 5. In SpringBoot, integration is completed by adding starter dependencies and configuring data sources and JPA attributes; 6. Transactions are made by @Transactiona

Java Cryptography Architecture (JCA) for Secure Coding Java Cryptography Architecture (JCA) for Secure Coding Aug 23, 2025 pm 01:20 PM

Understand JCA core components such as MessageDigest, Cipher, KeyGenerator, SecureRandom, Signature, KeyStore, etc., which implement algorithms through the provider mechanism; 2. Use strong algorithms and parameters such as SHA-256/SHA-512, AES (256-bit key, GCM mode), RSA (2048-bit or above) and SecureRandom; 3. Avoid hard-coded keys, use KeyStore to manage keys, and generate keys through securely derived passwords such as PBKDF2; 4. Disable ECB mode, adopt authentication encryption modes such as GCM, use unique random IVs for each encryption, and clear sensitive ones in time

LOL Game Settings Not Saving After Closing [FIXED] LOL Game Settings Not Saving After Closing [FIXED] Aug 24, 2025 am 03:17 AM

IfLeagueofLegendssettingsaren’tsaving,trythesesteps:1.Runthegameasadministrator.2.GrantfullfolderpermissionstotheLeagueofLegendsdirectory.3.Editandensuregame.cfgisn’tread-only.4.Disablecloudsyncforthegamefolder.5.RepairthegameviatheRiotClient.

How to use the Pattern and Matcher classes in Java? How to use the Pattern and Matcher classes in Java? Aug 22, 2025 am 09:57 AM

The Pattern class is used to compile regular expressions, and the Matcher class is used to perform matching operations on strings. The combination of the two can realize text search, matching and replacement; first create a pattern object through Pattern.compile(), and then call its matcher() method to generate a Matcher instance. Then use matches() to judge the full string matching, find() to find subsequences, replaceAll() or replaceFirst() for replacement. If the regular contains a capture group, the nth group content can be obtained through group(n). In actual applications, you should avoid repeated compilation patterns, pay attention to special character escapes, and use the matching pattern flag as needed, and ultimately achieve efficient

Edit bookmarks in chrome Edit bookmarks in chrome Aug 27, 2025 am 12:03 AM

Chrome bookmark editing is simple and practical. Users can enter the bookmark manager through the shortcut keys Ctrl Shift O (Windows) or Cmd Shift O (Mac), or enter through the browser menu; 1. When editing a single bookmark, right-click to select "Edit", modify the title or URL and click "Finish" to save; 2. When organizing bookmarks in batches, you can hold Ctrl (or Cmd) to multiple-choice bookmarks in the bookmark manager, right-click to select "Move to" or "Copy to" the target folder; 3. When exporting and importing bookmarks, click the "Solve" button to select "Export Bookmark" to save as HTML file, and then restore it through the "Import Bookmark" function if necessary.

'Java is not recognized' Error in CMD [3 Simple Steps] 'Java is not recognized' Error in CMD [3 Simple Steps] Aug 23, 2025 am 01:50 AM

IfJavaisnotrecognizedinCMD,ensureJavaisinstalled,settheJAVA_HOMEvariabletotheJDKpath,andaddtheJDK'sbinfoldertothesystemPATH.RestartCMDandrunjava-versiontoconfirm.

See all articles