huruyosi’s blog

プログラミングとかインフラとかのメモです。

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で行い、テストクラスのプロパティに設定します。 プロパティに設定した値をアサーションで利用します。