Rumah  >  Artikel  >  Java  >  Cara menggunakan anotasi SpringBoot @GroupSequenceProvider untuk melaksanakan pengesahan bersama pelbagai atribut kacang

Cara menggunakan anotasi SpringBoot @GroupSequenceProvider untuk melaksanakan pengesahan bersama pelbagai atribut kacang

WBOY
WBOYke hadapan
2023-05-11 17:49:19714semak imbas

Maklumat

Jujukan kumpulan @GroupSequenceProvider, @GroupSequence mengawal jujukan pengesahan data dan menyelesaikan masalah pengesahan logik bersama berbilang medan

Hibernate Validator menyediakan Bukan standard @GroupSequenceProvider注解. Berdasarkan status tika objek semasa, tentukan kumpulan pengesahan secara dinamik untuk dimuatkan ke dalam kumpulan pengesahan lalai.
Kita perlu menggunakan DefaultGroupSequenceProvider接口 yang disediakan oleh Pengesahan Hibernate untuk mengendalikan keadaan di mana atribut tersebut memasuki kumpulan yang ditentukan.

1. Persediaan awal

⏹Perhatikan bahawa nilai semakan tersuai tidak boleh kosong

@Documented
@Target({ ElementType.FIELD })
@Retention(RetentionPolicy.RUNTIME)
@Constraint(validatedBy = {ValidateIntegerNotEmpty.StrictIntegerNotEmptyValidator.class})
@ReportAsSingleViolation
public @interface ValidateIntegerNotEmpty {

    String msgArgs() default "";

	String message() default "{1001E}";

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

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

	class StrictIntegerNotEmptyValidator implements ConstraintValidator<ValidateIntegerNotEmpty, Integer> {

        @Override
        public boolean isValid(Integer value, ConstraintValidatorContext context) {

            return !ObjectUtils.isEmpty(value);
        }
    }
}

2 >1 Apabila status semakan ialah 2 (penolakan semakan awal manual), sebab penolakan semakan ialah

Medan yang diperlukan
    dan julat ialah 1 hingga 4
  • semasa semakan Jika status selain daripada 2 (dalam semakan atau lulus semakan awal manual), sebab untuk penolakan semakan ialah

    Item tidak diperlukan
  • ⏹Meja Hadapan

    <!DOCTYPE html>
    <html lang="en" xmlns:th="http://www.thymeleaf.org">
    <head>
        <script type="text/javascript" th:src="@{/js/public/jquery-3.6.0.min.js}"></script>
        <script type="text/javascript" th:src="@{/js/common/common.js}"></script>
        <title>test7页面</title>
    </head>
    <body>
    
        <button id="btn">校验数据</button>
    
        <h2>我是test7的页面</h2>
    </body>
    <script>
        $("#btn").click(() => {
    
            const param1 = {
            	// 人工初审拒绝
                auditStatus: 2,
                // 拒绝的原因
                auditRejectReason: 5,
            };
    
            const url = `http://localhost:8080/test7/groupSequenceProvider`;
            doAjax(url, param1, function(data) {
                console.log(data);
            });
        });
    </script>
    </html>
  • ⏹Borang1 untuk disahkan
import com.example.jmw.common.validation.ValidateIntegerNotEmpty;
import com.example.jmw.form.validation.ValidateTest7FormProvider;
import lombok.Data;
import org.hibernate.validator.constraints.Range;
import org.hibernate.validator.group.GroupSequenceProvider;

@Data
// 通过该注解所对应的自定义Provider来实现多属性联合校验
@GroupSequenceProvider(ValidateTest7FormProvider.class)
public class Test7Form {

    /**
     * 1: 审核中
     * 2: 人工初审拒绝
     * 3: 人工初审通过
     */
    @ValidateIntegerNotEmpty(msgArgs = "审核状态类型")
    @Range(min = 1, max = 3, message = "审核拒绝原因:参数传递错误")
    private Integer auditStatus;

    /**
     * 1: 不符合准入要求
     * 2: 三方数据拒贷
     * 3: 授信额度为0
     * 4: 其他
     */
    @ValidateIntegerNotEmpty(msgArgs = "审核拒绝原因", groups = auditGroup.class)
    @Range(min = 1, max = 4, message = "审核拒绝原因:参数传递错误", groups = auditGroup.class)
    private Integer auditRejectReason;
	
	// 自定义分组
    public interface auditGroup {
    }
}

⏹Validator

import com.example.jmw.form.Test7Form;
import org.hibernate.validator.spi.group.DefaultGroupSequenceProvider;
import org.springframework.util.ObjectUtils;

import java.util.ArrayList;
import java.util.List;
import java.util.Optional;

public class ValidateTest7FormProvider implements DefaultGroupSequenceProvider<Test7Form> {

    @Override
    public List<Class<?>> getValidationGroups(Test7Form test7Form) {

        List<Class<?>> defaultGroupSequence = new ArrayList<>();
        defaultGroupSequence.add(Test7Form.class);

        if (ObjectUtils.isEmpty(test7Form)) {
            return defaultGroupSequence;
        }

        // 获取 人工初审 状态
        Integer auditStatus = Optional.ofNullable(test7Form.getAuditStatus()).orElse(0) ;

        // 如果 人工初审通过的话,审核拒绝原因的auditGroup组就会起作用,就变为必填项目,否则为选填项目
        if (auditStatus == 2) {
            defaultGroupSequence.add(Test7Form.auditGroup.class);
        }

        return defaultGroupSequence;
    }
}

⏹Lapisan pengawal untuk pengesahan

@Controller
@RequestMapping("/test7")
public class Test7Controller {

    @Resource
    private LocalValidatorFactoryBean validator;

    @GetMapping("/init")
    public ModelAndView init() {

        ModelAndView modelAndView = new ModelAndView();
        modelAndView.setViewName("test7");
        return  modelAndView;
    }

    @PostMapping("/groupSequenceProvider")
    @ResponseBody
    public void groupSequenceProvider(@RequestBody Test7Form form) {

        Set<ConstraintViolation<Test7Form>> validate = validator.validate(form);
        for (ConstraintViolation<Test7Form> bean : validate) {

            // 获取当前的校验信息
            String message = bean.getMessage();
            System.out.println(message);
        }
    }
}

Apabila parameter auditStatus adalah 2 (ditolak oleh manual ), auditRejectReason (sebab penolakan audit) melebihi julat 1 hingga 4, jadi maklumat pengesahan dipaparkan

Apabila parameter auditStatus ialah 2 (penolakan semakan awal manual), auditRejectReason (audit Rejection reason) diperlukan, jadi maklumat pengesahan

Cara menggunakan anotasi SpringBoot @GroupSequenceProvider untuk melaksanakan pengesahan bersama pelbagai atribut kacang

dipaparkan Apabila parameter auditStatus ialah 3 (semakan awal manual diluluskan), auditRejectReason (sebab penolakan audit) adalah pilihan. Isi medan, jadi tiada maklumat kegagalan pengesahan

Cara menggunakan anotasi SpringBoot @GroupSequenceProvider untuk melaksanakan pengesahan bersama pelbagai atribut kacang

Keperluan

Cara menggunakan anotasi SpringBoot @GroupSequenceProvider untuk melaksanakan pengesahan bersama pelbagai atribut kacang

2 Apabila pelawat (1. ) melawat, terdapat paling banyak 2 kebenaran

  • Apabila ketua (2) mengakses, terdapat sehingga 4 kebenaran

  • Apabila pentadbir (3) akses, ada sehingga Terdapat 10 kebenaran

  • ⏹Meja hadapan

    <!DOCTYPE html>
    <html lang="en" xmlns:th="http://www.thymeleaf.org">
    <head>
        <script type="text/javascript" th:src="@{/js/public/jquery-3.6.0.min.js}"></script>
        <script type="text/javascript" th:src="@{/js/common/common.js}"></script>
        <title>test7页面</title>
    </head>
    <body>
    
        <button id="btn">校验数据</button>
    
        <h2>我是test7的页面</h2>
    </body>
    <script>
        $("#btn").click(() => {
    
            const param2 = {
            	// 领导(2)访问
                role: 2,
                // 权限的数量为5
                permissionList: [1, 1, 1, 1, 1],
            };
    
            const url = `http://localhost:8080/test7/groupSequenceProvider`;
            doAjax(url, param2, function(data) {
                console.log(data);
            });
        });
    </script>
    </html>
  • ⏹borang2 untuk disahkan
import com.example.jmw.common.validation.ValidateIntegerNotEmpty;
import com.example.jmw.form.validation.ValidateTest7Form1Provider;
import lombok.Data;
import org.hibernate.validator.constraints.Range;
import org.hibernate.validator.group.GroupSequenceProvider;

import javax.validation.constraints.Size;
import java.util.List;

@Data
// 通过该注解所对应的自定义Provider来实现多属性联合校验
@GroupSequenceProvider(ValidateTest7Form1Provider.class)
public class Test7Form1 {

    /**
     * 1: 访客
     * 2: 领导
     * 3: 管理员
     */
    @ValidateIntegerNotEmpty(msgArgs = "角色类型")
    @Range(min = 1, max = 3, message = "错误原因:参数传递错误")
    private Integer role;

    @Size.List({
            // 访客1个权限
            @Size(min = 1, max = 2, message = "访客最多拥有2个权限", groups = GuestGroup.class),
            // 领导4个权限
            @Size(min = 1, max = 4, message = "领导最多拥有4个权限", groups = LeaderGroup.class),
            // 管理员10个权限
            @Size(min = 1, max = 10, message = "管理员最多拥有10个权限", groups = AdminGroup.class)
    })
    private List<Integer> permissionList;
    
    // 游客分组
    public interface GuestGroup {
    }
    
    // 领导分组
    public interface LeaderGroup {
    }
    
    // 管理员分组
    public interface AdminGroup {
    }
}

⏹Pengesah

import com.example.jmw.form.Test7Form1;
import org.hibernate.validator.spi.group.DefaultGroupSequenceProvider;
import org.springframework.util.ObjectUtils;

import java.util.*;

public class ValidateTest7Form1Provider implements DefaultGroupSequenceProvider<Test7Form1> {

    /**
     * 1: 访客
     * 2: 领导
     * 3: 管理员
     */
    private final static List<Integer> roleList = Arrays.asList(1, 2, 3);

    @Override
    public List<Class<?>> getValidationGroups(Test7Form1 test7Form1) {

        List<Class<?>> defaultGroupSequence = new ArrayList<>();
        defaultGroupSequence.add(Test7Form1.class);

        if (ObjectUtils.isEmpty(test7Form1)) {
            return defaultGroupSequence;
        }

        // 获取角色code
        Integer role = Optional.ofNullable(test7Form1.getRole()).orElse(0) ;
        if (!roleList.contains(role)) {
            return defaultGroupSequence;
        }

        // 根据角色code,开启相应的组校验
        if (role == 1) {
            defaultGroupSequence.add(Test7Form1.GuestGroup.class);
        } else if (role == 2) {
            defaultGroupSequence.add(Test7Form1.LeaderGroup.class);
        } else if (role == 3) {
            defaultGroupSequence.add(Test7Form1.AdminGroup.class);
        }

        return defaultGroupSequence;
    }
}

⏹ Lapisan pengawal melakukan pengesahan

@Controller
@RequestMapping("/test7")
public class Test7Controller {

    @Resource
    private LocalValidatorFactoryBean validator;

    @GetMapping("/init")
    public ModelAndView init() {

        ModelAndView modelAndView = new ModelAndView();
        modelAndView.setViewName("test7");
        return  modelAndView;
    }

    @PostMapping("/groupSequenceProvider")
    @ResponseBody
    public void groupSequenceProvider(@RequestBody Test7Form1 form) {

        Set<ConstraintViolation<Test7Form1>> validate = validator.validate(form);
        for (ConstraintViolation<Test7Form1> bean : validate) {

            // 获取当前的校验信息
            String message = bean.getMessage();
            System.out.println(message);
        }
    }
}

Apabila peranan adalah 2 (pemimpin), paling banyak hanya 4 kebenaran, jadi maklumat pengesahan dipaparkan

Apabila peranan adalah 1 (tetamu), terdapat hanya 2 kebenaran paling banyak, jadi maklumat pengesahan dipaparkan

Cara menggunakan anotasi SpringBoot @GroupSequenceProvider untuk melaksanakan pengesahan bersama pelbagai atribut kacang

Apabila peranan adalah 3 (pentadbir), terdapat 10 paling banyak Kebenaran, jadi tiada maklumat pengesahan

Cara menggunakan anotasi SpringBoot @GroupSequenceProvider untuk melaksanakan pengesahan bersama pelbagai atribut kacang

Atas ialah kandungan terperinci Cara menggunakan anotasi SpringBoot @GroupSequenceProvider untuk melaksanakan pengesahan bersama pelbagai atribut kacang. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Artikel ini dikembalikan pada:yisu.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam