我正在努力将一些项目从 java 11 迁移到 java 17,以及从 Spring Boot 2.7.8 迁移到 Spring Boot 3.0.0。
我在测试类中有以下方法:
protected void stub(HttpMethod method, String url, ResponseDefinitionBuilder response) {
switch (method) {
case GET:
wireMockServer.stubFor(get(urlMatching(url)).willReturn(response));
break;
case POST:
wireMockServer.stubFor(post(urlMatching(url)).willReturn(response));
break;
case PUT:
wireMockServer.stubFor(put(urlMatching(url)).willReturn(response));
break;
case DELETE:
wireMockServer.stubFor(delete(urlMatching(url)).willReturn(response));
break;
default:
throw new RuntimeException("invalid http method");
}
}
使用 java 11 时,但是当我切换到 java 17 并在 pom.xml 中指定了以下内容:
<properties>
<java.version>17</java.version>
和
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>3.0.0</version>
<relativePath/>
</parent>
代码因以下错误而停止工作:
patterns in switch statements are a preview feature and are disabled by default.
显然它会干扰 java 17 中的模式匹配预览功能。
正确的解决方案是什么?
类型
HttpMethod
已从an enum
类型更改为非enum
类型。因此,你不能再switch
了。错误消息令人困惑,因为您可以使用模式匹配切换非enum
类型,因此编译器假设您正在尝试这样做。
另一种方法是切换字符串表示形式。这也是清理这段代码的机会:
protected void stub(HttpMethod method, String url, ResponseDefinitionBuilder response) {
var um = urlMatching(url);
var processed = switch(method.name()) {
case "GET" -> get(um);
case "POST" -> post(um);
case "PUT" -> put(um);
case "DELETE" -> delete(um);
default -> throw new RuntimeException("invalid or unsupported http method");
};
wireMockServer.stubFor(processed.willReturn(response));
}