在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("\n")).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

Spring实现封装自定义注解@Trimmed清除字符串前后的空格的更多相关文章

  1. spring + quartz 分布式自定义注解

    相关技术 本文采用spring + quartz的方案.使用mysql作为任务的持久化,支持分布式. 自定义注解 1.启用定时任务 @Target(ElementType.TYPE) @Retenti ...

  2. redis分布式锁-spring boot aop+自定义注解实现分布式锁

    接这这一篇redis分布式锁-java实现末尾,实现aop+自定义注解 实现分布式锁 1.为什么需要 声明式的分布式锁 编程式分布式锁每次实现都要单独实现,但业务量大功能复杂时,使用编程式分布式锁无疑 ...

  3. 使用spring aspect控制自定义注解

    自定义注解:这里是一个处理异常的注解,当调用方法发生异常时,返回异常信息 /** * ErrorCode: * * @author yangzhenlong * @since 2016/7/21 */ ...

  4. spring AOP 和自定义注解进行身份验证

    一个SSH的项目(springmvc+hibernate),需要提供接口给app使用.首先考虑的就是权限问题,app要遵循极简模式,部分内容无需验证,用过滤器不能解决某些无需验证的方法 所以最终选择用 ...

  5. 创建spring管理的自定义注解

    转自: http://blog.csdn.net/wuqiqing_1/article/details/52763372 Annotation其实是一种接口.通过Java的反射机制相关的API来访问A ...

  6. Spring Boot中自定义注解+AOP实现主备库切换

    摘要: 本篇文章的场景是做调度中心和监控中心时的需求,后端使用TDDL实现分表分库,需求:实现关键业务的查询监控,当用Mybatis查询数据时需要从主库切换到备库或者直接连到备库上查询,从而减小主库的 ...

  7. Spring Boot实现自定义注解

    在Spring Boot项目中可以使用AOP实现自定义注解,从而实现统一.侵入性小的自定义功能. 实现自定义注解的过程也比较简单,只需要3步,下面实现一个统一打印日志的自定义注解: 1. 引入AOP依 ...

  8. spring boot通过自定义注解和AOP拦截指定的请求

    一 准备工作 1.1 添加依赖 通过spring boot创建好工程后,添加如下依赖,不然工程中无法使用切面的注解,就无法对制定的方法进行拦截 <dependency> <group ...

  9. spring mvc实现自定义注解

    实现方式:使用@Aspect实现: 1. 新建注解接口:CheckSign package com.soeasy.web.utils; import org.springframework.core. ...

随机推荐

  1. 暴力/思维 HDOJ 5386 Cover

    题目传送门 /* 题意:给出刷墙的所有的方法,求一种顺序,使得原矩阵刷成目标矩阵 暴力:(题解)我们只要每次找一行或一列颜色除了0都相同的,然后如果有对应的操作,就把这行这列都赋值成0即可 */ /* ...

  2. 242 Valid Anagram 有效的字母异位词

    给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的一个字母异位词.例如,s = "anagram",t = "nagaram",返回 true ...

  3. log4j2异步日志解读(一)AsyncAppender

    log4j.logback.log4j2 历史和关系,我们就在这里不展开讲了.直接上干货,log4j2突出于其他日志的优势,异步日志实现. 看一个东西,首先看官网文档 ,因为前面文章已经讲解了disr ...

  4. [ CodeForces 1064 B ] Equations of Mathematical Magic

    \(\\\) \(Description\) \(T\) 组询问,每次给出一个 \(a\),求方程 \[ a-(a\oplus x)-x=0 \] 的方案数. \(T\le 10^3,a\le 2^{ ...

  5. Python中深拷贝与浅拷贝的区别

    转自:http://blog.csdn.net/u014745194/article/details/70271868 定义: 在Python中对象的赋值其实就是对象的引用.当创建一个对象,把它赋值给 ...

  6. 网页内容爬取:如何提取正文内容 BEAUTIFULSOUP的输出

    创建一个新网站,一开始没有内容,通常需要抓取其他人的网页内容,一般的操作步骤如下: 根据url下载网页内容,针对每个网页的html结构特征,利用正则表达式,或者其他的方式,做文本解析,提取出想要的正文 ...

  7. 两年,VMware又重回巅峰?

    两年前,被公有云和容器打的焦头烂额的VMware一度被众多业界人士看衰,营收.股价双双下滑.然而,仅仅经过短短两年时间,VMware已经和AWS,IBM.微软.Rackspace等众多公有云厂商成为合 ...

  8. Caffe RPN:把RPN网络layer添加到caffe基础结构中

    在测试MIT Scene Parsing Benchmark (SceneParse150)使用FCN网络时候,遇到Caffe错误. 遇到错误:不可识别的网络层crop 网络层 CreatorRegi ...

  9. java操作zip文件

    思路: 1).读取zip中的文件并将除了重名文件之外的文件转存到中转zip文件中. 2).往中转文件中插入txt文件. 3).删除原zip文件. 4).将中转zip文件重命名为原zip文件. 前提,t ...

  10. Mac上简单常用Terminal命令

    方案1 SSH是一个非常伟大的工具,如果你要在互联网上远程连接到服务器,那么SSH无疑是最佳的候选.SSH是加密的,OpenSSH加密所有通信(包括密码),有效消除了窃听,连接劫持和其它攻击.本文将为 ...