gpt4 book ai didi

java - 如何自动(通过 UT)检测 REST 合约中缺少的无参数构造函数?

转载 作者:行者123 更新时间:2023-12-01 19:40:39 25 4
gpt4 key购买 nike

我正在开发一个 SpringBoot 应用程序,其中包含数十个带有数十种方法的 REST 端点。所有这些都使用 @RestController 注解进行声明。因此,出现了大量的 POJO,它们充当所有这些方法的契约。新开发人员经常忘记在这些类上声明无参数构造函数。因此,这会遇到此链接下描述的问题: https://javarevisited.blogspot.com/2014/01/why-default-or-no-argument-constructor-java-class.html

更糟糕的是,这种错误是在应用程序部署到测试环境后才检测到的。

所以我的问题是有没有一种简单的方法可以自动检测 Java 中缺少的无参数构造函数?没有带有 @EnableMvc 注释的测试套件?最好是为新创建的 POJO 检测此类情况。

最佳答案

我知道的唯一解决方案是 java Reflection,您必须扫描包然后检查注释,然后对于默认构造函数尝试此测试类,它将打印没有默认构造函数的类。

public class TestListIni {


String scaningPackage = "your package name";

public void startTesting() {

List<ClassLoader> classLoadersList = new LinkedList<ClassLoader>();
classLoadersList.add(ClasspathHelper.contextClassLoader());
classLoadersList.add(ClasspathHelper.staticClassLoader());

Reflections reflections = new Reflections(
new ConfigurationBuilder().setScanners(new SubTypesScanner(false), new ResourcesScanner())
.setUrls(ClasspathHelper.forClassLoader(classLoadersList.toArray(new ClassLoader[0])))
.filterInputsBy(new FilterBuilder().include(FilterBuilder.prefix(scaningPackage))));

Set<Class<? extends Object>> allClasses = reflections.getSubTypesOf(Object.class);

allClasses.forEach(oneClass -> {
RestController addTotest = oneClass.getAnnotation(RestController.class);
if (addTotest != null) {
//check for default constructor
boolean flag = hasParameterlessPublicConstructor(oneClass);
if(!flag){
sysout("this has no default constructor " oneClass.getName());
}
} else {
System.err.println("Scanned and exclued class " + oneClass.getName());
}
});


}

private boolean hasParameterlessPublicConstructor(Class<?> clazz) {
for (Constructor<?> constructor : clazz.getConstructors()) {

if (constructor.getParameterCount() == 0) {
return true;
}
}
return false;
}
}

依赖:

<dependency>
<groupId>org.reflections</groupId>
<artifactId>reflections</artifactId>
<version>0.9.11</version>
</dependency>

关于java - 如何自动(通过 UT)检测 REST 合约中缺少的无参数构造函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55490532/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com