zoukankan      html  css  js  c++  java
  • Spring实现封装自定义注解@Trimmed清除字符串前后的空格

    在Spring中实现字符串清除的方法有很多,原生方法String自带trim()方法,或者使用StringUtils提供的trim...方法。

    通常可以将上面的方式封装成自定义注解的形式去实现来节省更多的业务代码。

    Trimmed.java:

    import java.lang.annotation.Documented;
    import java.lang.annotation.ElementType;
    import java.lang.annotation.Retention;
    import java.lang.annotation.RetentionPolicy;
    import java.lang.annotation.Target;
    
    /**
     * 清除字符串前后的空格
     */
    @Target(value = { ElementType.FIELD, ElementType.METHOD, ElementType.PARAMETER })
    @Retention(RetentionPolicy.RUNTIME)
    @Documented
    public @interface Trimmed {
    
        public static enum TrimmerType {
            SIMPLE, ALL_WHITESPACES, EXCEPT_LINE_BREAK;
        }
    
        TrimmerType value() default TrimmerType.ALL_WHITESPACES;
    
    }

    TrimmedAnnotationFormatterFactory.java:

    import java.text.ParseException;
    import java.util.Collections;
    import java.util.HashMap;
    import java.util.HashSet;
    import java.util.Locale;
    import java.util.Map;
    import java.util.Set;
    import java.util.regex.Pattern;
    
    import org.springframework.format.AnnotationFormatterFactory;
    import org.springframework.format.Formatter;
    import org.springframework.format.Parser;
    import org.springframework.format.Printer;
    
    import Trimmed.TrimmerType;
    
    /**
     * 清除字符串前后的空格自定义注解格式工厂
     */
    public class TrimmedAnnotationFormatterFactory implements AnnotationFormatterFactory<Trimmed> {
    
        private static final Map<TrimmerType, TrimmerFormatter> TRIMMER_FORMATTER_MAP;
    
        static {
            TrimmerType[] values = Trimmed.TrimmerType.values();
            Map<TrimmerType, TrimmerFormatter> map = new HashMap<TrimmerType, TrimmerFormatter>(values.length);
            for (TrimmerType type : values) {
                map.put(type, new TrimmerFormatter(type));
            }
            TRIMMER_FORMATTER_MAP = Collections.unmodifiableMap(map);
        }
    
        @Override
        public Set<Class<?>> getFieldTypes() {
            Set<Class<?>> fieldTypes = new HashSet<Class<?>>(1, 1);
            fieldTypes.add(String.class);
            return fieldTypes;
        }
    
        @Override
        public Parser<?> getParser(Trimmed annotation, Class<?> fieldType) {
            return TRIMMER_FORMATTER_MAP.get(annotation.value());
        }
    
        @Override
        public Printer<?> getPrinter(Trimmed annotation, Class<?> fieldType) {
            return TRIMMER_FORMATTER_MAP.get(annotation.value());
        }
    
        private static class TrimmerFormatter implements Formatter<String> {
    
            private static final Pattern PATTERN_WHITESPACES = Pattern.compile("\s+");
            private static final Pattern PATTERN_WHITESPACES_WITH_LINE_BREAK = Pattern.compile("\s*\n\s*");
            private static final Pattern PATTERN_WHITESPACES_EXCEPT_LINE_BREAK = Pattern.compile("[\s&&[^\n]]+");
    
            private final TrimmerType type;
    
            public TrimmerFormatter(TrimmerType type) {
                if (type == null)
                    throw new NullPointerException();
                this.type = type;
            }
    
            @Override
            public String print(String object, Locale locale) {
                return object;
            }
    
            @Override
            public String parse(String text, Locale locale) throws ParseException {
                text = text.trim();
                switch (type) {
                case ALL_WHITESPACES:
                    return PATTERN_WHITESPACES.matcher(text).replaceAll(" ");
                case EXCEPT_LINE_BREAK:
                    return PATTERN_WHITESPACES_EXCEPT_LINE_BREAK
                            .matcher(PATTERN_WHITESPACES_WITH_LINE_BREAK.matcher(text).replaceAll("
    ")).replaceAll(" ");
                case SIMPLE:
                    return text;
                default:
                    // not possible
                    throw new AssertionError();
                }
            }
    
        }
    
    }

    集成方法参考:http://www.cnblogs.com/EasonJim/p/7592260.html

    上面注解的使用方法直接是在方法字段使用@Trimmed即可。支持属性和方法上的字段注入。

    使用注意:

    1、如果用了@RequestParam(defaultValue = "")时,会导致为null,但是如果defaultValue有值时,一切正常。

    参考:

    https://jira.spring.io/browse/SPR-7768(以上的封装来自此篇文章)

    实现自定义注解的方法收集:

    http://www.importnew.com/14479.html

    http://blog.csdn.net/jrainbow/article/details/52382728

    http://blog.csdn.net/jrainbow/article/details/46709543

    http://blog.csdn.net/linhaiyun_ytdx/article/details/65939885

    http://blog.csdn.net/soundfly/article/details/17380741

  • 相关阅读:
    LeetCode偶尔一题 —— 617. 合并二叉树
    《剑指offer》 —— 链表中倒数第k个节点
    《剑指offer》 —— 青蛙跳台阶问题
    《剑指offer》—— 二维数组中的查找
    《剑指offer》—— 替换空格
    《剑指offer》—— 合并两个排序的链表
    《剑指offer》—— 礼物的最大价值
    生成Nuget 源代码包来重用你的Asp.net MVC代码
    Pro ASP.Net Core MVC 6th 第四章
    Pro ASP.NET Core MVC 6th 第三章
  • 原文地址:https://www.cnblogs.com/EasonJim/p/7592352.html
Copyright © 2011-2022 走看看