spring boot で context-pathを設定する
素のservletで開発を行っている頃は当たり前の様に設定していたcontext-pathを spring boot MVC で設定します。
設定方法
application.yml
設定は application.yml に「server.contextPath」を設定します。
server: contextPath: /hogeApp
コントローラー
@RequestMapping
アノテーションのvalues値は context-pathを除いた値を設定します。たとえば context-path を 含んだURLが 「/hogeApp/report/project」にするのであれば、@RequestMapping(value = "/report/project", method = RequestMethod.GET)
にします。
thymeleafのviewテンプレート
たとえばcss を読み込むlinkタグを<link href="/hogeApp/bootstrap/css/bootstrap.min.css" rel="stylesheet" />
とするのであれば、<link th:href="@{/bootstrap/css/bootstrap.min.css}" rel="stylesheet" />
とします。@{...}
を使うことでcontext-pathの値が反映されます。
MockMvcを使ったテストコード
org.springframework.test.web.servlet.MockMvc
を使って処理結果がリダイレクトを期待するテストコードは下の様に書きます。
@RunWith(SpringJUnit4ClassRunner.class) @SpringApplicationConfiguration(classes = App.class) @WebAppConfiguration @Transactional public class ReportControllerTest { @Autowired WebApplicationContext wac; @Autowired TestingCcontext context; MockMvc mockMvc; /** application.yml に定義されている contextPath */ String serverContextPath; @Before public void setup() { mockMvc = MockMvcBuilders.webAppContextSetup(wac).build(); serverContextPath = wac.getEnvironment().getProperty("server.contextPath"); } @Test public void 期間指定されない() throws Exception{ context.setClock(Clock.fixed(Instant.parse("2001-01-06T09:54:30.00Z"), ZoneId.systemDefault())); mockMvc.perform(get("/workTimes")) .andExpect(status().isFound()) .andExpect(header().string("Location", serverContextPath + "/workTimes/2001-01")) ; } }
mockMvc.performのURIにはcontext-pathの値を含めていませんが、レスポンスヘッダーのLocationにはcontext-pathが付与されています。そのため、素直に比較すると失敗します。
application.ymlに定義したcontext-pathを取得する方法として、wac.getServletContext().getConetxtPath()を試すと空文字になっていたので駄目でした。
ならばと、application.ymlの定義を直接取得するために、wac.getEnvironment().getProperty("server.contextPath")
を使います。
これを@Beforeで行い、テストクラスのプロパティに設定します。
プロパティに設定した値をアサーションで利用します。