转载自:
http://www.ibm.com/developerworks/cn/java/j-lo-spring-utils2/index.html
方法入参检测工具类
Web 应用在接受表单提交的数据后都需要对其进行合法性检查,如果表单数据不合法,请求将被驳回。类似的,当我们在编写类的方法时,也常常需要对方法入参进行合法性检查,如果入参不符合要求,方法将通过抛出异常的方式拒绝后续处理。举一个例子:有一个根据文件名获取输入流的方法:InputStream getData(String file),为了使方法能够成功执行,必须保证 file 入参不能为 null 或空白字符,否则根本无须进行后继的处理。这时方法的编写者通常会在方法体的最前面编写一段对入参进行检测的代码,如下所示:
public InputStream getData(String file) {
if (file == null || file.length() == 0|| file.replaceAll("\\s", "").length() == 0) {
throw new IllegalArgumentException("file入参不是有效的文件地址");
}
…
}
类似以上检测方法入参的代码是非常常见,但是在每个方法中都使用手工编写检测逻辑的方式并不是一个好主意。阅读 Spring 源码,您会发现 Spring 采用一个 org.springframework.util.Assert 通用类完成这一任务。
Assert 翻译为中文为“断言”,使用过 JUnit 的读者都熟知这个概念,它断定某一个实际的运行值和预期想一样,否则就抛出异常。Spring 对方法入参的检测借用了这个概念,其提供的 Assert 类拥有众多按规则对方法入参进行断言的方法,可以满足大部分方法入参检测的要求。这些断言方法在入参不满足要求时就会抛出 IllegalArgumentException。下面,我们来认识一下 Assert 类中的常用断言方法:
断言方法 说明
1. notNull(Object object)
当 object 不为 null 时抛出异常,notNull(Object object, String message) 方法允许您通过 message 定制异常信息。和 notNull() 方法断言规则相反的方法是 isNull(Object object)/isNull(Object object, String message),它要求入参一定是 null;
2. isTrue(boolean expression) / isTrue(boolean expression, String message)
当 expression 不为 true 抛出异常;
3. notEmpty(Collection collection) / notEmpty(Collection collection, String message)
当集合未包含元素时抛出异常。
notEmpty(Map map) / notEmpty(Map map, String message) 和 notEmpty(Object[] array, String message) / notEmpty(Object[] array, String message) 分别对 Map 和 Object[] 类型的入参进行判断;
4. hasLength(String text) / hasLength(String text, String message) 当 text 为 null 或长度为 0 时抛出异常;
5. hasText(String text) / hasText(String text, String message) text 不能为 null 且必须至少包含一个非空格的字符,否则抛出异常;
6. isInstanceOf(Class clazz, Object obj) / isInstanceOf(Class type, Object obj, String message) 如果 obj 不能被正确造型为 clazz 指定的类将抛出异常;
7. isAssignable(Class superType, Class subType) / isAssignable(Class superType, Class subType, String message) subType 必须可以按类型匹配于 superType,否则将抛出异常;
使用 Assert 断言类可以简化方法入参检测的代码,如 InputStream getData(String file) 在应用 Assert 断言类后,其代码可以简化为以下的形式:
public InputStream getData(String file){
Assert.hasText(file,"file入参不是有效的文件地址");
① 使用 Spring 断言类进行方法入参检测
…
}
可见使用 Spring 的 Assert 替代自编码实现的入参检测逻辑后,方法的简洁性得到了不少的提高。Assert 不依赖于 Spring 容器,您可以大胆地在自己的应用中使用这个工具类.
分享到:
相关推荐
2. **Assert(断言)**:在Java编程中,`assert`关键字用于在测试阶段检查代码假设是否正确,它是进行单元测试和调试的强大工具。在本项目中,通过扩展Spring Boot的断言功能,我们可以创建自定义的断言方法,以适应...
在Spring Boot中,`Assert`工具类提供了一系列静态方法,如`notNull()`、`isNull()`、`isTrue()`等,用于进行数据合法性检查,确保程序运行时不会出现意外情况。例如,`notNull()`方法可以用来检查传入的对象是否为...
本文将对Spring Boot中内置的常用工具类进行深入探讨,帮助开发者充分认识到其强大功能和应用价值。 首先,我们要了解断言工具类。在编程中,断言是一种强大的错误检测方式,它允许开发者在程序执行的某些关键点上...
4. org.springframework.util.xml.Assert 断言工具类,在我们的参数判断时应该经常使用,常用的方法有 assertNotNull()、assertEquals() 等。 5. org.springframework.util.xml.ClassUtils 用于 Class 的处理工具类...
7. **Spring Framework**: Spring框架中的`BeanUtils` 和 `CollectionsUtils` 提供了对象复制和集合操作的便利,而`Assert` 类则提供了断言功能。 8. **Apache Commons Collections**: 提供了对Java集合框架的扩展...
首先,我们需要确保我们的开发环境中已经安装了TestNG和Spring框架,以及相关的构建工具,例如Maven或Gradle。 1. **集成TestNG和Spring**:在Spring应用中使用TestNG,我们需要在测试配置中声明TestNG测试监听器。...
本文将探讨两种在Spring Boot中实现Controller间调用的方法及其优缺点。 首先,我们可以使用`RestTemplate`来模拟远程调用。这是一种常见的HTTP客户端工具,允许Controller A通过HTTP请求访问Controller B。以下是...
【标题】"mybatis+spring+springtest" 涉及到的是在Java开发中集成MyBatis、Spring以及Spring Test框架的知识点。这个标题暗示了我们正在讨论如何在项目中整合这三个强大的工具来实现数据访问层(DAO)的自动化测试...
1. `@ContextConfiguration`:这个注解用于定义测试类中Spring配置的位置。通过指定XML配置文件或者Java配置类,我们可以创建并初始化一个测试所需的IoC容器。 2. `@Autowired`:在测试类中,我们可以使用@...
同时,Spring4还支持注解驱动的配置,通过`@Configuration`注解标记类为配置类,并使用`@Component`、`@Service`、`@Repository`和`@Controller`等注解进行组件扫描。这种方式可以替代传统的XML配置,使代码更加简洁...
在测试类中,首先需要初始化`MockMvc`实例: ```java private MockMvc mockMvc; @Autowired private WebApplicationContext wac; @Before public void setupMockMvc() { mockMvc = MockMvcBuilders....
通过 `BoolQueryBuilder` 和 `AggregationBuilders` 等工具类,可以构建出丰富的查询和聚合表达式。 ### 8. 分页与排序 在 Repository 方法中,可以使用 `Pageable` 参数来实现分页,使用 `Sort` 来指定排序规则。...
在测试类中,我们可以使用JUnit的@Test注解来标识测试方法,并利用Hamcrest的Matchers进行断言。例如,如果我们有一个UserService类,我们可以编写一个测试方法来检查UserService的getUserById方法是否正确返回用户...
本篇文章将深入探讨如何在Spring项目中集成TestNG和Mockito进行单元测试。 TestNG是一个强大的测试框架,它扩展了JUnit的功能,提供了更灵活的测试配置,如并发测试、更丰富的注解、更详尽的测试报告等。首先,你...
3. 配置JdbcTemplate或JPA:Spring提供了JdbcTemplate和JPA等工具简化数据库操作。根据你的需求选择合适的方式,并在配置文件中声明相应的bean。 4. 测试连接:编写一个简单的测试类,验证Spring是否能成功连接到...
在测试类中,我们可以使用`@Autowired`注解来注入`MyService`实例: ```java import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import ...
- 将`struts.xml`中的Action类设置为Spring配置文件中的Bean ID: ```xml <result name="success">/jsp/loginSuccess.jsp <result name="error">/jsp/loginError.jsp ``` #### 2.2 使用JUnit4.7测试...
Spring框架是Java开发中广泛应用的一个开源框架,以其强大的依赖注入(Dependency Injection,...通过学习和实践这个"demo",开发者能够更好地掌握Spring的测试工具和最佳实践,从而在项目中实现更健壮、可靠的软件。
2. 使用@Test注解:在JUnit测试类中,为每个测试方法添加@Test注解,然后编写测试逻辑。测试方法通常会模拟输入参数,调用待测试的方法,并验证返回结果或数据库状态。 3. 测试事务管理:由于iBatis和Spring都是...