Java能否自定义注解实现String字段赋值时自动过滤非法字符?
字段自动清理方案可行性说明
你提出的自定义@MyAnnotation注解实现String字段自动清理垃圾字符的方案完全可行,根据你的技术栈场景,可以选择不同的实现路径:
- JSON参数转换场景:可直接扩展Jackson的序列化/反序列化逻辑,给自定义注解绑定值处理逻辑,JSON转对象时会自动触发字段清理
- 通用赋值场景:可通过AOP切面拦截属性赋值、对象拷贝等逻辑,反射扫描标注了
@MyAnnotation的String字段,执行清理后再赋值 - 兼容校验规范场景:可基于Bean Validation规范自定义约束,同时实现校验和值修正能力
简易实现示例(Spring Boot + Jackson)
- 自定义注解
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 { }
- 实现字符串清理反序列化器
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已默认集成该能力,自定义校验注解的步骤如下:
- 定义校验注解
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 {}; }
- 实现校验器逻辑
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].*"); } }
- 启用校验能力
- 校验方法单个参数:在方法所在类上添加
@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
相关产品推荐
相关产品推荐

