javax的@Valid注解使用场景

Posted

技术标签:

【中文标题】javax的@Valid注解使用场景【英文标题】:javax's @Valid annotation usage scenario 【发布时间】:2021-11-17 17:43:28 【问题描述】:

下面的场景可以使用@Valid (javax.validation.Valid)吗?

import com.fasterxml.jackson.databind.ObjectMapper;
import javax.validation.Valid;
import com.incident.tool.model.IncidentModel;

@Service
public class JsonStringToObjectConverter 

    public IncidentModel convertToObject(String json) throws JsonMappingException, JsonProcessingException 
        @Valid
        IncidentModel incidentModel = new ObjectMapper().readValue(json, IncidentModel.class);
        return incidentModel ;
    

这里JsonStringToObjectConvertor 以字符串的形式接收JSON,并将其映射到IncidentModel 类。我在IncidentModel 中以下列方式定义了一些验证,我想在继续之前验证ObjectMapperIncidentModel 中映射的字段:

@Component
@Getter
@Setter
@ToString
@NoArgsConstructor
@AllArgsConstructor
public class IncidentModel extends IncidentInfo 
    @NotEmpty
    private String empId;

    @NotEmpty
    @Size(min = 2, max = 30)
    private String empName;

    @NotEmpty
    private String title;
    private String description;
    private String assignedTo;
    private String severity;
    private String incidentNumber;
    private String dateCreated;
    private String dateClosed;
    private String closingNotes;

上面的格式好像不行,convertToObject方法中的@Valid有什么替代方法吗?

感谢您的帮助。

【问题讨论】:

【参考方案1】:

你可以这样做:

@Service
public class JsonStringToObjectConverter 

    public IncidentModel convertToObject(String json) throws JsonMappingException, JsonProcessingException 
        IncidentModel incidentModel = new ObjectMapper().readValue(json, IncidentModel.class);
        
        ValidatorFactory factory = Validation.buildDefaultValidatorFactory();
        Validator validator = factory.getValidator();
        Set<ConstraintViolation<IncidentModel>> errors = validator.validate(incidentModel);
        
        return incidentModel;
    

然后您可以对此进行优化并将ValidatorFactory factoryValidator validator 实例变量设为JsonStringToObjectConverter,这样您就不会在每次调用convertToObject 方法时重新创建它们。

【讨论】:

不客气!

以上是关于javax的@Valid注解使用场景的主要内容,如果未能解决你的问题,请参考以下文章

GroupSequenceProvider动态校验入参

@Validated注解和@Valid注解区别

Java使用@Valid+BindingResult进行controller参数校验

使用@Valid+BindingResult进行controller参数校验

@Valid和@Validated的总结区分(转)

@validated注解怎么用