Raise each other

技術ブログ、と言えるほどのものではありませんが学んだことを記すことにしました

ログイン機能を持ったアプリを作成したときにswaggerにアクセスしたら404が返ってきた話

こんにちわ、こんばんわ。

今月初めに発売した某アクションゲームでまだメインキャラが決まっておりません。

別キャラ使いはじめるハードルが高いんですよね〜〜

 

さて雑談はこれぐらいにしておき、今回は自分が作成しているアプリについてです。

 

導入

GitHubと連携ができ、未ログイン時に他のページにアクセスした際にはUNAUTHORIZEDを返すWebアプリを作成しているときに、swaggerにアクセスするとNot Foundが返ってきてしまいました。

 

使用言語:Java

フレームワーク:spring boot 2.0.1

 

 

対処

最初はswaggerの依存ライブラリの問題かなーと思って一回削除して再度入れ直して見たが変わらずNot Foundが返ってくる...

 

ということでアクセス時のログを見てみると、

No mapping found for HTTP request with URI [/swagger-ui.html] in DispatcherServlet with name 'dispatcherServlet'

とのこと。

マッピングされてないよ!っていやいや今までできてたじゃんと思ったけど、ちゃんと見てみるとDispatcherServletにないよーって書いてあった。

どうやら作成したWebMvcConfigureの子クラスが問題らしい。

静的なコンテンツはデフォルトサーブレットじゃないとダメなのにDispatcherServletをルートパスにマッピングするとデフォルトサーブレットが呼び出されないんだとか。

 

ということでswaggerを表示するために必要なことは、

・ swaggerをマッピングしてしまう

・ DispatcherServletをルートパスにマッピングしつつ、デフォルトサーブレット経由でドキュメントルート上の静的リソースにアクセスできるようにする

のどちらか

 

具体的な記述としては以下の通り。

・swaggerのUrlをマッピングしてしまう

import org.springframework.context.annotation.*;
import org.springframework.web.servlet.config.annotation.*;
@Configuration
@EnableWebMvc
public class WebMvcConfig implements WebMvcConfigurer {

@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("swagger-ui.html")
.addResourceLocations("classpath:/META-INF/resources/");

registry.addResourceHandler("/webjars/**")
.addResourceLocations("classpath:/META-INF/resources/webjars/");
}
}

※こちらの記述の場合マッピングされているUrlが起動時のログに表示されている。

 

・DispatcherServletをルートパスにマッピングしつつ、デフォルトサーブレット経由でドキュメントルート上の静的リソースにアクセスできるようにする

import org.springframework.context.annotation.*;
import org.springframework.web.servlet.config.annotation.*;

@Configuration
@EnableWebMvc
public class WebMvcConfig implements WebMvcConfigurer {

@Override
public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
configurer.enable();
}
}
 

所感

アプリ作成がひと段落したところでswaggerにアクセスしようとしたらできなかったので原因を特定しようとしたのだが、swagger関連で弄ったところがなかったため特定に時間がかかってしまった。

ログもうちょっとしっかり見るようにしないとなぁ。。。

そして結構記事がある内容らしい。調べる力も必要ですね。

それはさておき、1回1回マッピングするよりデフォルトサーブレットを経由できた方が後にもいい気がするんですけどネット上の記事ではswaggerのUrlをマッピングしちゃう書き方が多かったんですよね。

何か理由あるんでしょうか。マサカリお待ちしております(言ってみたかっただけ

 

ブログに関しては何か書こう書こうとしていたら2週間も空いてしまったw

難しく考えすぎなのかもしれない、自分のレベルは高くないのだから地道に分からないことを記すようにします。。

 

参考

Spring MVC(+Spring Boot)上での静的リソースへのアクセスを理解する - Qiita