You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用@DecimalMin/@DecimalMax验证List<BigDecimal>及Spring中CMYK颜色属性

Hey there! Let's break down your two validation questions with practical, Spring-friendly solutions that fit your use case perfectly.

1. Validating List with @DecimalMin and @DecimalMax

Out of the box, @DecimalMin and @DecimalMax only validate single BigDecimal values—they don’t know how to handle entire collections. To check every element in your list, you’ll need to pair two tools:

  • @Valid: Tells the validation framework to recursively validate the elements inside the list.
  • Generic parameter-level constraints: Apply @DecimalMin and @DecimalMax directly to the BigDecimal in the List’s generic type.

Here’s how that looks in your POJO:

import jakarta.validation.Valid;
import jakarta.validation.constraints.DecimalMax;
import jakarta.validation.constraints.DecimalMin;
import java.math.BigDecimal;
import java.util.List;

public class ColorRequest {
    @Valid
    private List<@DecimalMin(value = "0.0", message = "Each value can't be less than 0.0")
                  @DecimalMax(value = "1.0", message = "Each value can't be more than 1.0") BigDecimal> cmyk;

    // Getters and setters
}

A quick note: This generic parameter trick requires a Bean Validation implementation that supports it (Hibernate Validator 6.0+ works perfectly, which is the default in most Spring Boot projects). Also, make sure your controller class is annotated with @Validated, or use @Valid on the request body parameter to trigger the validation.

2. Full Validation for Your CMYK Color Property

For your CMYK requirement—JSON array converted to List<BigDecimal>, exactly 4 elements, each between 0.0 and 1.0—you’ll need to add size validation on top of the element range checks. Here are two solid options:

Option 1: Combine @Size with Element-Level Constraints

The simplest approach is to slap a @Size annotation on the list to enforce the 4-element rule, paired with the generic constraints from the first question:

import jakarta.validation.Valid;
import jakarta.validation.constraints.DecimalMax;
import jakarta.validation.constraints.DecimalMin;
import jakarta.validation.constraints.Size;
import java.math.BigDecimal;
import java.util.List;

public class ColorRequest {
    @Valid
    @Size(min = 4, max = 4, message = "CMYK color must contain exactly 4 values")
    private List<@DecimalMin(value = "0.0", message = "Each color component can't be less than 0.0")
                  @DecimalMax(value = "1.0", message = "Each color component can't be more than 1.0") BigDecimal> cmyk;

    // Getters and setters
}

This is straightforward and works for most cases—no extra code needed beyond standard validation annotations.

Option 2: Custom @CmykColor Annotation (Cleaner Reusable Code)

If you want to encapsulate the entire CMYK validation logic into a single, reusable annotation (great if you need this rule in multiple places), create a custom constraint:

Step 1: Define the @CmykColor Annotation

import jakarta.validation.Constraint;
import jakarta.validation.Payload;
import java.lang.annotation.*;

@Documented
@Constraint(validatedBy = CmykColorValidator.class)
@Target({ElementType.FIELD, ElementType.PARAMETER})
@Retention(RetentionPolicy.RUNTIME)
public @interface CmykColor {
    String message() default "Invalid CMYK format: must be an array of exactly 4 values between 0.0 and 1.0";

    Class<?>[] groups() default {};

    Class<? extends Payload>[] payload() default {};
}

Step 2: Write the Validator Logic

import jakarta.validation.ConstraintValidator;
import jakarta.validation.ConstraintValidatorContext;
import java.math.BigDecimal;
import java.util.List;

public class CmykColorValidator implements ConstraintValidator<CmykColor, List<BigDecimal>> {
    private static final BigDecimal MIN_RANGE = new BigDecimal("0.0");
    private static final BigDecimal MAX_RANGE = new BigDecimal("1.0");

    @Override
    public boolean isValid(List<BigDecimal> cmykValues, ConstraintValidatorContext context) {
        // Check if list exists and has exactly 4 elements
        if (cmykValues == null || cmykValues.size() != 4) {
            return false;
        }
        // Check each value is within 0.0-1.0
        for (BigDecimal value : cmykValues) {
            if (value == null || value.compareTo(MIN_RANGE) < 0 || value.compareTo(MAX_RANGE) > 0) {
                return false;
            }
        }
        return true;
    }
}

Step 3: Use the Custom Annotation in Your POJO

import java.math.BigDecimal;
import java.util.List;

public class ColorRequest {
    @CmykColor
    private List<BigDecimal> cmyk;

    // Getters and setters
}

This keeps your POJO clean and centralizes the validation logic—if you ever need to adjust the CMYK rules (like changing the range), you only have to update the validator class.

Just remember to trigger validation in your controller: add @Valid or @Validated to your request body parameter, and Spring will handle checking the constraints automatically.

内容的提问来源于stack exchange,提问作者Thomas Fritsch

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 07:49:58