RESTEasy模拟框架在没有异常映射器的情况下工作正常 - 接收请求并返回具有预期内容的实体.
注册异常映射器并强制异常后,当RESTEasy内部调用ResteasyProviderFactory.getContextData(type)时调用失败,返回null,导致出现意外错误消息:"无法找到类型的上下文数据:javax.servlet.http.HttpServletRequest" .
无法在网上任何地方找到RESTEasy模拟加上异常映射器的任何示例,也无法找到有关错误的任何有用信息.
客户类:
package com.foo;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlType;
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "foo-type", propOrder = {
"name"
})
@XmlRootElement(name = "foo")
public class Foo {
protected String name;
public String getName() {
return name;
}
public void setName(String value) {
this.name = value;
}
}
Run Code Online (Sandbox Code Playgroud)
对象工厂:
package com.foo;
import javax.xml.bind.annotation.XmlRegistry;
@XmlRegistry
public class ObjectFactory {
public ObjectFactory() {
}
public Foo createFoo() {
return new Foo();
}
}
Run Code Online (Sandbox Code Playgroud)
验证异常:
package com.foo;
public …Run Code Online (Sandbox Code Playgroud) public class A {
}
public class B {
public static void b() {
System.out.println(A.class);
}
}
Run Code Online (Sandbox Code Playgroud)
如何A.class在B.class的字节码中编译类文字?它是一个现场参考?我在Oracle/Sun的字节码文档中找不到这一点.
无论是什么原因,反编译器都可以轻松地重建它:
java -jar decompiler.jar B.class
Run Code Online (Sandbox Code Playgroud)
拿起JAVA_TOOL_OPTIONS:' - Dfile.encoding = UTF8'
// //由Procyon v0.5.30反编译// //
public class B
{
public static void b() {
System.out.println(A.class); <<<
}
}
Run Code Online (Sandbox Code Playgroud)我们根据自述文件将https://github.com/sherter/google-java-format-gradle-plugin连接到我们的项目中。
我们还连接了一个 pre-commit 钩子来在提交之前运行插件,这确保了更改列表中的所有代码在推送之前都已格式化,这避免了在我们运行verGJF任务时 Jenkins 中的错误。
但是我们必须记住在运行goJF之前在本地运行./gradlew build,否则构建会因格式错误而失败。
我们通过为 IntelliJ添加https://plugins.jetbrains.com/plugin/8527-google-java-format和https://plugins.jetbrains.com/plugin/7642-save-actions插件来解决这个问题,启用google-java-format 插件,并配置 save-actions 插件以在保存时格式化。
但这是开发人员必须记住要经历的许多额外配置,而且这意味着他们无法在处理代码时按照他们想要的方式格式化代码,只能在构建或提交时重新格式化。
我们更喜欢全 Gradle 解决方案,以便goJF任务在build任务之前运行(并且在verGJF任务之前运行,该任务已经build通过 google-java-format Gradle 插件绑定到任务)。
我们无法弄清楚如何做到这一点。别人知道吗?
我按照https://spring.io/guides/gs/spring-boot/#scratch中的说明进行操作,但是当它说运行时:
./gradlew build && java -jar build/libs/gs-spring-boot-0.1.0.jar
构建失败并出现上述错误。
失败之前有一条消息说:
此版本中使用了已弃用的 Gradle 功能,使其与 Gradle 5.0 不兼容。请参阅https://docs.gradle.org/4.8.1/userguide/command_line_interface.html#sec:command_line_warnings
但网上的每个人都说这只是一个警告。
该构建似乎没有创建或下载 build/libs/gs-spring-boot-0.1.0.jar。
目前首次尝试使用 Gradle 时完全被阻止。
我们配置了排除:
def coverageExcludes() {
return [
"com/ourcompany/*Config*",
"com/ourcompany/ServiceApplication*",
"com/ourcompany/Shutdown*",
"com/ourcompany/ShutdownConnector*",
"com/ourcompany/Tomcat*",
"com/ourcompany/TomcatCustomConnectorCustomizer*",
"com/ourcompany/endpoint/exception/**",
"com/ourcompany/endpoint/util/ObjectMapperBuilder*",
"com/ourcompany/framework/**",
"com/ourcompany/helper/ApiHelper*",
"com/ourcompany/helper/OffsetDateTimeDeserializer*",
"com/ourcompany/persistence/entity/**",
"com/ourcompany/persistence/exception/**",
"com/ourcompany/service/exception/ServiceException*",
"com/ourcompany/service/model/**",
"com/ourcompany/v2/**",
"com/ourcompany/v3/**"
]
}
Run Code Online (Sandbox Code Playgroud)
将它们用于jacocoTestReport:
jacocoTestReport {
reports {
xml {
enabled true
}
html {
enabled true
}
}
getExecutionData().setFrom(fileTree(buildDir).include("/jacoco/*.exec"));
afterEvaluate {
classDirectories.setFrom(files(classDirectories.files.collect {
fileTree(dir: it,
exclude: coverageExcludes()
)
}))
for (Object c : classDirectories) {
System.out.println(c);
}
}
}
Run Code Online (Sandbox Code Playgroud)
并且排除工作:
然后我们尝试在验证任务中使用相同的排除,并将覆盖率失败阈值设置为 0.87,因为这就是覆盖率报告中显示的内容:
jacocoTestCoverageVerification {
afterEvaluate {
classDirectories.setFrom(files(classDirectories.files.collect {
fileTree(dir: it,
exclude: coverageExcludes()
)
}))
for …Run Code Online (Sandbox Code Playgroud)