Caused by: java.lang.NullPointerException: Cannot invoke

JavaとSpringboot+Swaggerのブログを書こうと思ったけど、久しぶりに触るので、色々エラーが発生しました。それでこの記事を書きます。

エラー内容

Caused by: java.lang.NullPointerException: Cannot invoke "org.springframework.web.servlet.mvc.condition.PatternsRequestCondition.getPatterns()" because "this.condition" is null
久しぶりのNullPointerException。
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パスマッチャーが適用されなかったので、適用してあげました。

参考

https://stackoverflow.com/questions/72235752/cannot-invoke-org-springframework-web-servlet-mvc-condition-patternsrequestcond

コメントを残す