如何用ArchUnit匹配泛型类型ResponseEntity的构造方法调用?
解决ArchUnit匹配泛型类ResponseEntity构造方法的问题
你遇到的问题确实和泛型有关,callConstructor(ResponseEntity.class, String.class, HttpStatus.class)无法匹配目标调用,是因为ArchUnit的这个方法在匹配泛型类构造方法时,对泛型擦除后的类型匹配逻辑有局限。用callConstructorWhere自定义匹配条件就能解决这个问题。
方案一:使用Lambda自定义匹配逻辑
直接通过构造方法的声明类和原始参数类型来匹配:
ArchRule rule = noClasses().should().callConstructorWhere( constructor -> constructor.getDeclaringClass().isAssignableTo(ResponseEntity.class) && constructor.getRawParameterTypes().length == 2 && constructor.getRawParameterTypes()[0].equals(String.class) && constructor.getRawParameterTypes()[1].equals(HttpStatus.class) ).because("foo");
方案二:借助ArchUnit的ConstructorPredicates工具类
用预定义的断言组合,代码更简洁:
import com.tngtech.archunit.core.domain.ConstructorPredicates; ArchRule rule = noClasses().should().callConstructorWhere( ConstructorPredicates.declaredIn(ResponseEntity.class) .and(ConstructorPredicates.withRawParameterTypes(String.class, HttpStatus.class)) ).because("foo");
原理说明
泛型擦除后,new ResponseEntity<>(...)实际调用的构造方法属于原始类型ResponseEntity,参数类型依然是String和HttpStatus。callConstructorWhere允许我们绕过callConstructor的精确匹配限制,直接检查构造方法的核心特征——声明类和原始参数类型,从而精准命中目标构造调用。
内容的提问来源于stack exchange,提问作者JosephH
相关产品推荐
相关产品推荐

