java设置校验功能,关于java:java校验功能的使用

JSR303校验的应用步骤

给Bean增加校验注解:javax.validation.contrains, 并定义本人的message提示信息

开启校验性能,在具体的办法参数中增加@Valid;这样校验出错是会有默认的谬误响应信息

给校验的bean前面紧跟一个BindingResult参数, 就能够获取到校验的后果

分组校验(实现多场景的简单校验)

1.比方增加时必须为空;批改时不能为空的字段

@Null(groups={AddGroup.class})

@NotNull(groups={UpdateGroup.class})

private Long brandId;

2.给校验注解标注什么状况下进行校验

@RequestMapping("/update")

public R update(@Validated(value={UpdateGroup.class}) @RequestBody BrandEntity brand){

...

}

3.留神点:

1. 实体类上没有增加groups时,如果应用了分组校验,例如`@Validated(value={AddGroup.class})`,将不会对该字段进行校验

2. 实体类上没有增加groups时,如果不增加校验分组,例如只用`@Validated`,则会对该字段进行校验

对立的异样解决

在解决校验后果是,如果再每一个解决办法中都进行一场的解决比拟繁琐,咱们能够应用SpringMVC为咱们提供的@ControllerAdvice进行对立的异样解决

应用步骤

编写异样解决类, 并在类上增加@ControllerAdvice

在类中增加异样解决的办法, 并在办法上增加@ExceptionHandler

实例

/*集中处理所有异样*/

@Slf4j

//@ResponseBody

//@ControllerAdvice(basePackages = "com.atguigu.gulimall.product")

@RestControllerAdvice(basePackages = "com.atguigu.gulimall.product")

public class GulimallExceptionControllerAdvice {

@ExceptionHandler(value = MethodArgumentNotValidException.class)

public R handleException(MethodArgumentNotValidException e) {

BindingResult bindingResult = e.getBindingResult();

Map map = new HashMap<>();

bindingResult.getFieldErrors().forEach((item) -> {

String message = item.getDefaultMessage();

String field = item.getField();

map.put(field, message);

});

log.error("数据校验呈现问题{},异样类型:{}", e.getMessage(), e.getClass());

return R.error(BizCodeEnum.VALID_EXCEPTION.getCode(), BizCodeEnum.VALID_EXCEPTION.getMsg()).put("data", map);

}

@ExceptionHandler(value = Throwable.class)

public R handleThrowable(Throwable e) {

log.error("数据校验呈现问题{},异样类型:{}", e.getMessage(), e.getClass());

return R.error(BizCodeEnum.UNKNOWN_EXCEPTION.getCode(), BizCodeEnum.UNKNOWN_EXCEPTION.getMsg());

}

}

自定义的校验

1.编写一个校验注解

2.编写一个校验器 ConstrainValidator

3.关联校验注解和校验器

例子:

@ListValue(vals={0,1})

private Integer showStatus;

示例:

pom文件中增加依赖

javax.validation

validation-api

2.0.1.Final

java代码如下:

package com.atguigu.common.valid;

import javax.validation.Constraint;

import javax.validation.ConstraintValidator;

import javax.validation.ConstraintValidatorContext;

import javax.validation.Payload;

import java.lang.annotation.*;

import java.util.HashSet;

import java.util.Set;

@Documented

/*3. 将校验器和自定义注解关联*/

@Constraint(validatedBy = {ListValueConstrainValidator.class})

@Target({ElementType.METHOD, ElementType.FIELD, ElementType.ANNOTATION_TYPE, ElementType.CONSTRUCTOR, ElementType.PARAMETER, ElementType.TYPE_USE})

@Retention(RetentionPolicy.RUNTIME)

/*1.自定义校验器ListValue*/

public @interface ListValue {

String message() default "{com.atguigu.common.valid.ListValue.message}";

Class>[] groups() default {};

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

// 无效的值

int[] vals() default {};

}

/*2.自定义的校验器, 须要实现ConstraintValidator*/

class ListValueConstrainValidator implements ConstraintValidator {

Set set = new HashSet();

@Override

public void initialize(ListValue constraintAnnotation) {

int[] vals = constraintAnnotation.vals();

for (int v : vals) {

set.add(v);

}

}

//value 以后要校验的值

@Override

public boolean isValid(Integer value, ConstraintValidatorContext constraintValidatorContext) {

return set.contains(value);

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java编写敏感词校验功能可以使用Trie树数据结构来实现。具体实现过程如下: 1. 定义TrieNode类,用于表示Trie树节点。每个节点包含一个字符和一个Map类型的子节点集合。 ``` class TrieNode { char c; Map<Character, TrieNode> children = new HashMap<Character, TrieNode>(); boolean isEndOfWord; public TrieNode() {} public TrieNode(char c){ this.c = c; } } ``` 2. 定义Trie类,用于构建Trie树。Trie类包含一个根节点和两个方法:insert和search。 ``` class Trie { private TrieNode root; public Trie() { root = new TrieNode(); } public void insert(String word) { TrieNode node = root; for (int i = 0; i < word.length(); i++) { char c = word.charAt(i); if (!node.children.containsKey(c)) { node.children.put(c, new TrieNode(c)); } node = node.children.get(c); } node.isEndOfWord = true; } public boolean search(String word) { TrieNode node = root; for (int i = 0; i < word.length(); i++) { char c = word.charAt(i); if (!node.children.containsKey(c)) { return false; } node = node.children.get(c); } return node.isEndOfWord; } } ``` 3. 在需要校验敏感词的地方,先将敏感词列表插入到Trie树中。然后,遍历需要校验的文本,逐个字符判断是否在Trie树上存在。 ``` Trie trie = new Trie(); List<String> sensitiveWords = Arrays.asList("敏感词1", "敏感词2", "敏感词3"); for (String word : sensitiveWords) { trie.insert(word); } String text = "这是一段需要校验的文本,其中包含敏感词1和敏感词2"; for (int i = 0; i < text.length(); i++) { for (int j = i + 1; j <= text.length(); j++) { String subtext = text.substring(i, j); if (trie.search(subtext)) { // 存在敏感词,相应处理 } } } ``` 以上是一种基本的敏感词校验实现方式,可以根据具体需求进行优化和改进。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值