JavaとSpringboot+Swaggerのブログを書こうと思ったけど、久しぶりに触るので、色々エラーが発生しました。それでこの記事を書きます。
エラー内容
久しぶりのNullPointerException。Caused by: java.lang.NullPointerException: Cannot invoke "org.springframework.web.servlet.mvc.condition.PatternsRequestCondition.getPatterns()" because "this.condition" is null
this.conditionがNullだそうですね。
原因
このエラーの原因としてはリクエストのマッピングパターンが正しく設定されていない可能性があります。Spring MVCでは、コントローラメソッドやリクエストマッピングに対して特定のパスパターンを指定する必要です。
ただ、今回は正しく作成しました。以下がControllerのサンプルです。
@RestController
@RequestMapping("/api/")
public class HomeController {
@GetMapping("/example")
public String getExample() {
return "Hello world!";
}
}
Spring MVCでは、リクエストのURLパスとコントローラーのリクエストマッピングを比較し、一致する場合に対応するメソッドを呼び出します。リクエストパスのマッチング方式には、デフォルトでAntパスマッチャー方式が使用されますが、Swagger設定とのマッチができなかったのかうまくいかなかったです。
Antパスマッチャーは、アスタリスク(*)やダブルアスタリスク(**)などの特殊文字を使ってパターンマッチングを行う方法です。例えば、/api/*というパターンは/api/userや/api/productなどにマッチしますが、/api/user/profileにはマッチしないようです。
解決
application.propertiesに以下を追加することで解決できました。
spring.mvc.pathmatch.matching-strategy=ant_path_matcher
上記を設定することで、Spring MVCがAntパスマッチャー方式を使用してリクエストパスのマッチングを行います。デフォルトではAntパスマッチャーが使用されるため、特に理由がない限り設定する必要はありませんが、Antパスマッチャーが適用されなかったので、適用してあげました。
