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

Java能否自定义注解实现String字段赋值时自动过滤非法字符?

字段自动清理方案可行性说明

你提出的自定义@MyAnnotation注解实现String字段自动清理垃圾字符的方案完全可行,根据你的技术栈场景,可以选择不同的实现路径:

  • JSON参数转换场景:可直接扩展Jackson的序列化/反序列化逻辑,给自定义注解绑定值处理逻辑,JSON转对象时会自动触发字段清理
  • 通用赋值场景:可通过AOP切面拦截属性赋值、对象拷贝等逻辑,反射扫描标注了@MyAnnotation的String字段,执行清理后再赋值
  • 兼容校验规范场景:可基于Bean Validation规范自定义约束,同时实现校验和值修正能力

简易实现示例(Spring Boot + Jackson)

  1. 自定义注解
import com.fasterxml.jackson.annotation.JacksonAnnotationsInside;
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
import java.lang.annotation.*;

@JacksonAnnotationsInside
@JsonDeserialize(using = CleanStringDeserializer.class)
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface MyAnnotation {
}
  1. 实现字符串清理反序列化器
import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.databind.DeserializationContext;
import com.fasterxml.jackson.databind.deser.std.StdDeserializer;
import java.io.IOException;

public class CleanStringDeserializer extends StdDeserializer<String> {

    public CleanStringDeserializer() {
        super(String.class);
    }

    @Override
    public String deserialize(JsonParser p, DeserializationContext ctxt) throws IOException {
        String originValue = p.getValueAsString();
        if (originValue == null) {
            return null;
        }
        // 替换为你自己的垃圾字符清理逻辑,示例为移除控制字符并去除首尾空格
        return originValue.replaceAll("[\\x00-\\x1F\\x7F]", "").trim();
    }
}

配置完成后,你示例中Model类标注了@MyAnnotation的字段,在JSON反序列化为对象时就会自动完成垃圾字符清理。

Java注解实现方法入参校验的方案

Java生态有标准化的校验规范JSR-380(Bean Validation 2.0),常用实现为Hibernate Validator,Spring Boot已默认集成该能力,自定义校验注解的步骤如下:

  1. 定义校验注解
import javax.validation.*;
import java.lang.annotation.*;

@Target({ElementType.PARAMETER, ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
@Constraint(validatedBy = CleanStringValidator.class)
public @interface ValidCleanString {
    // 校验失败的提示信息
    String message() default "字符串包含非法字符";
    // 分组校验用
    Class<?>[] groups() default {};
    // 负载扩展用
    Class<? extends Payload>[] payload() default {};
}
  1. 实现校验器逻辑
import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;

public class CleanStringValidator implements ConstraintValidator<ValidCleanString, String> {
    @Override
    public boolean isValid(String value, ConstraintValidatorContext context) {
        // 空值可以单独用@NotNull注解校验,这里默认放行
        if (value == null) {
            return true;
        }
        // 替换为你自己的校验逻辑,示例为判断是否包含控制字符
        return !value.matches(".*[\\x00-\\x1F\\x7F].*");
    }
}
  1. 启用校验能力
  • 校验方法单个参数:在方法所在类上添加@Validated注解,在需要校验的参数前加自定义的@ValidCleanString注解即可
  • 校验方法POJO类型参数:在POJO参数前添加@Valid注解,POJO内部字段标注对应的校验注解即可触发校验

如果是普通非Spring项目,也可以手动构建Validator实例触发校验:

ValidatorFactory factory = Validation.buildDefaultValidatorFactory();
Validator validator = factory.getValidator();
// 校验对象,返回所有校验不通过的结果
Set<ConstraintViolation<Model>> violations = validator.validate(modelInstance);

内容的提问来源于stack exchange,提问作者Snehasis Rout

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 16:09:02