当前位置: 首页 > news >正文

注解方式实现主类属性和组合子类属性递归Valid校验

项目场景:

提示:Valid校验子类对象中属性:

问题描述

例如:类中包含基本属性与组合子类属性时,子类属性的Valid校验递归@NotBlank、@NotNull不生效。

问题解决方案

如何通过注解方式来实现类属性递归Valid校验?

业务控制层LedgerRest

@RequestMapping("/ledger")
public class LedgerRest {

    @PostMapping("/workOrderCallback")
    public Map<String, Object> workOrderCallback(
   	    @Valid @RequestBody LedgerCallbackReq ledgerCallbackReq) 
   	{
      return ledgerService.workOrderCallback(ledgerCallbackReq);
    }
    
}

主类LedgerCallbackReq

import io.swagger.annotations.ApiModelProperty;
import lombok.*;
import javax.validation.Valid;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.NotNull;
import java.util.List;

/**
 * @Desc  请求参数Req
 */
@Setter
@Getter
@AllArgsConstructor
@NoArgsConstructor
public class LedgerCallbackReq {
    @ApiModelProperty("绑定关系外键")
    @NotBlank(message = "foreignKey不能为空或空白")
    @NotNull(message = "foreignKey不能为空或空白")
    public String foreignKey;
    
    @NotBlank(message = "绑定状态bindingStatus不能为空或空白")
    @NotNull(message = "绑定状态bindingStatus不能为空或空白")
    public String bindingStatus;

    @ApiModelProperty("模板字段列表")
    @NotEmpty(message = "模板字段列表不能为空")
    @Valid
    public List<LedgerCallbackColumnList> columnList;
}

主类中组合类型的子类 LedgerCallbackColumnList

import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.NotNull;

/**
 * @Description
 * @Date 2025/4/10 20:56
 * @Created by chenjun
 */
@Setter
@Getter
@AllArgsConstructor
@NoArgsConstructor
public class LedgerCallbackColumnList {
    @ApiModelProperty("主键")
    @NotBlank(message = "主键id不能为空或空白")
    public String id;

    @ApiModelProperty("模板code")
    @NotNull(message = "模板code不能为空或空白")
    @NotBlank(message = "模板code不能为空或空白")
    public String templateCode; 
    
    @ApiModelProperty("字段值")
    @JsonIgnoreProperties({"optionValues"})
    public String optionValues;
}

主类属性和组合子类与String转化

问题描述:Json串转换成组合类对象时,Json串中部分属性节点可以不存在或者存在不确定性,转换成组合类对象时忽略此属性值。
解决思路:
1.采用fastjson实现String(JSON)转换成组合类对象
2. Json串中存在不确定性的属性节点映射的类属性加入: @JsonIgnoreProperties({“format”})
解决方式:

pom.xml依赖 fastjson

<!-- https://mvnrepository.com/artifact/com.alibaba/fastjson -->
<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>fastjson</artifactId>
    <version>1.2.83</version>
</dependency>

转换类FormItemDto定义

import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import lombok.Data;
import java.util.List;
/**
 * 扩展工单基础表单、台账表单Form组件
 */
@Data
public class FormItemDto {
  //自定义表单字段属性
  public String title;
  public String name;
  public String icon;
  public String value;
  public String valueType;
  public String id;
  //台账表单字段属性
  public String ledgerField;
  public String ledgerValueEn;
  public String ledgerType;
  public String ledgerKeyItem;
  public FormItemPropsDto props;

  @Data
  public static class FormItemPropsDto {
    private Boolean required;
    private Boolean enablePrint;
    //JSONField忽略属性expanding映射
    @JsonIgnoreProperties({"expanding"})
    private Boolean  expanding;
    //JSONField忽略属性format映射
    @JsonIgnoreProperties({"format"})
    private String format;//日期格式,"format": "YYYY-MM-DD HH:mm:ss"
    @JsonIgnoreProperties({"options"})
    //JSONField忽略属性options映射
    private List<String> options;
  }
}

转换测试类LedgerServiceTest

import com.alibaba.fastjson.JSON;
import com.isoftstone.order.Main;
import lombok.extern.slf4j.Slf4j;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit.jupiter.SpringExtension;
import java.util.ArrayList;
import java.util.List;
/**
 * @Description
 * @Date 2025/4/10 17:29
 * @Created by chenjun
 */
@ExtendWith(SpringExtension.class)
@Slf4j
@SpringBootTest(classes = Main.class)
public class LedgerServiceTest {
    @Test
    public void orderWorkerFormDtoTest(){
        String orderWorkerForm = "[{\"icon\":\"EditPen\",\"id\":\"field1791775564953\",\"ledgerField\":\"2\",\"ledgerKeyItem\":\"0\",\"ledgerType\":\"\",\"ledgerValueEn\":\"\",\"name\":\"TextInput\",\"props\":{\"enablePrint\":true,\"required\":true},\"title\":\"单行文本输入\",\"value\":\"\",\"valueType\":\"String\"},{\"icon\":\"MoreFilled\",\"id\":\"field6482675568504\",\"ledgerField\":\"2\",\"ledgerKeyItem\":\"0\",\"ledgerType\":\"\",\"ledgerValueEn\":\"\",\"name\":\"TextareaInput\",\"props\":{\"enablePrint\":true,\"required\":true},\"title\":\"多行文本输入\",\"value\":\"\",\"valueType\":\"String\"},{\"icon\":\"CircleCheck\",\"id\":\"field6585575571954\",\"ledgerField\":\"2\",\"ledgerKeyItem\":\"0\",\"ledgerType\":\"\",\"ledgerValueEn\":\"\",\"name\":\"SelectInput\",\"props\":{\"enablePrint\":true,\"expanding\":true,\"options\":[\"是\",\"否\"],\"required\":true},\"title\":\"单选框(是否)\",\"value\":\"\",\"valueType\":\"String\"},{\"icon\":\"Finished\",\"id\":\"field2349975573055\",\"ledgerField\":\"2\",\"ledgerKeyItem\":\"0\",\"ledgerType\":\"\",\"ledgerValueEn\":\"\",\"name\":\"MultipleSelect\",\"props\":{\"enablePrint\":true,\"expanding\":true,\"options\":[\"选项1\",\"选项2\"],\"required\":true},\"title\":\"多选框\",\"value\":\"[]\",\"valueType\":\"Array\"},{\"icon\":\"Calendar\",\"id\":\"field5650675574627\",\"ledgerField\":\"2\",\"ledgerKeyItem\":\"0\",\"ledgerType\":\"\",\"ledgerValueEn\":\"\",\"name\":\"DateTime\",\"props\":{\"enablePrint\":true,\"format\":\"YYYY-MM-DD HH:mm:ss\",\"required\":true},\"title\":\"日期时间点\",\"value\":\"\",\"valueType\":\"Date\"},{\"icon\":\"CircleCheck\",\"id\":\"field0541787442910\",\"ledgerField\":\"1\",\"ledgerKeyItem\":\"0\",\"ledgerType\":\"T4\",\"ledgerValueEn\":\"testLedgerCode\",\"name\":\"SelectInput\",\"props\":{\"enablePrint\":true,\"expanding\":true,\"options\":[\"是\",\"否\"],\"required\":true},\"title\":\"台账编号\",\"value\":\"是 否\",\"valueType\":\"String\"},{\"icon\":\"CircleCheck\",\"id\":\"field4420728703814\",\"ledgerField\":\"1\",\"ledgerKeyItem\":\"0\",\"ledgerType\":\"T1\",\"ledgerValueEn\":\"testLedgerList\",\"name\":\"SelectInput\",\"props\":{\"enablePrint\":true,\"expanding\":false,\"options\":[\"值1\",\"值2\",\"值3\"],\"required\":true},\"title\":\"台账名称\",\"value\":\"值1 值2 值3\",\"valueType\":\"String\"}]";
        List<FormItemDto> formItemList = new ArrayList<>();
        // 自定义表单解析成对象
        try {
            formItemList = JSON.parseArray(orderWorkerForm, FormItemDto.class);
            log.info("formItemList:{}",formItemList.get(0).getId());
        }catch (Exception e){
            log.error("orderWorkerInputInfo转换失败");
        }
    }
}

相关文章:

  • 八大定位UI
  • Ubuntu在桌面缺少图标
  • Android Studio - 解决 Please Select Android SDK
  • 【3dSwap】3D-Aware Face Swapping
  • Linux安装postgresql17
  • spring boot大文件与多文件下载
  • 超级码科技发布镂空AI保险胶带,重塑包装防伪新标准
  • 全国产V7-690T核心板/算法验证板/FPGA开发板
  • spring security 漏洞保护
  • AI:深度学习之循环神经网络(RNN)
  • DotnetCore开源库SampleAdmin源码编译
  • C++ STL及Python中等效实现
  • Linux蓝牙协议栈驱动CSR8510 USB Dongle
  • Sqoop常用指令
  • 黑马点评 秒杀优惠券单体下一人一单超卖问题
  • spring cloud gateway 转发 ws 流量
  • 【3GPP】【5G】精讲5G系统的策略和计费控制框架
  • 【MySQL从入门到精通】之基础概念详解
  • 多版本go冲突问题
  • 数据结构-哈希表
  • 六合哪家做网站建设/google图片搜索引擎入口
  • 开发网站开发工程师招聘要求/百度标注平台怎么加入
  • 网站制作的基本步骤/2023年8月新闻热点事件
  • 网站手机端做排名/电商seo优化
  • 兰州做网站优化的公司/百度一下就知道
  • 中国空间站纪念币/电商具体是做什么的