Spring 4.1和Java 8:java.util.Optional
由于Spring 4.1的Java 8的的java.util.Optional ,容器對象可能會或可能不包含非空值,支持與@RequestParam , @RequestHeader和@MatrixVariable 。 使用Java 8的java.util.Optional請確保參數永遠不會為null 。
請求參數
在此示例中,我們將使用@RequestParam將java.time.LocalDate綁定為java.util.Optional :
@RestController @RequestMapping("o") public class SampleController {@RequestMapping(value = "r", produces = "text/plain")public String requestParamAsOptional(@DateTimeFormat(iso = DateTimeFormat.ISO.DATE)@RequestParam(value = "ld") Optional<LocalDate> localDate) {StringBuilder result = new StringBuilder("ld: ");localDate.ifPresent(value -> result.append(value.toString()));return result.toString();} }在Spring 4.1之前,我們會遇到一個例外,即找不到匹配的編輯器或轉換策略。 從Spring 4.1開始,這不再是問題。 為了驗證綁定是否正常工作,我們可以創(chuàng)建一個簡單的集成測試:
@RunWith(SpringJUnit4ClassRunner.class) @SpringApplicationConfiguration(classes = Application.class) @WebAppConfiguration public class SampleSomeControllerTest {@Autowiredprivate WebApplicationContext wac;private MockMvc mockMvc;@Beforepublic void setUp() throws Exception {mockMvc = MockMvcBuilders.webAppContextSetup(wac).build();}// ...}在第一個測試中,我們將檢查綁定是否正常工作以及是否返回了正確的結果:
@Test public void bindsNonNullLocalDateAsRequestParam() throws Exception {mockMvc.perform(get("/o/r").param("ld", "2020-01-01")).andExpect(content().string("ld: 2020-01-01")); }在下一個測試中,我們將不傳遞ld參數:
@Test public void bindsNoLocalDateAsRequestParam() throws Exception {mockMvc.perform(get("/o/r")).andExpect(content().string("ld: ")); }兩個測試都應該是綠色的!
請求標題
同樣,我們可以將@RequestHeader綁定到java.util.Optional :
@RequestMapping(value = "h", produces = "text/plain") public String requestHeaderAsOptional(@RequestHeader(value = "Custom-Header") Optional<String> header) {StringBuilder result = new StringBuilder("Custom-Header: ");header.ifPresent(value -> result.append(value));return result.toString(); }和測試:
@Test public void bindsNonNullCustomHeader() throws Exception {mockMvc.perform(get("/o/h").header("Custom-Header", "Value")).andExpect(content().string("Custom-Header: Value")); }@Test public void noCustomHeaderGiven() throws Exception {mockMvc.perform(get("/o/h").header("Custom-Header", "")).andExpect(content().string("Custom-Header: ")); }矩陣變量
在Spring 3.2中@MatrixVariable注釋指示方法參數應綁定到路徑段內的名稱/值對:
@RequestMapping(value = "m/{id}", produces = "text/plain") public String execute(@PathVariable Integer id,@MatrixVariable Optional<Integer> p,@MatrixVariable Optional<Integer> q) {StringBuilder result = new StringBuilder();result.append("p: ");p.ifPresent(value -> result.append(value));result.append(", q: ");q.ifPresent(value -> result.append(value));return result.toString(); }可以通過/o/m/42;p=4;q=2 url調用上述方法。 讓我們?yōu)榇俗鲆粋€測試:
@Test public void bindsNonNullMatrixVariables() throws Exception {mockMvc.perform(get("/o/m/42;p=4;q=2")).andExpect(content().string("p: 4, q: 2")); }不幸的是,該測試將失敗,因為默認情況下,Spring MVC中禁用了對@MatrixVariable批注的支持。 為了啟用它,我們需要調整配置并將RequestMappingHandlerMapping的removeSemicolonContent屬性設置為false 。 默認情況下,它設置為true 。 我已經用WebMvcConfigurerAdapter完成了,如下所示:
@Configuration public class WebMvcConfig extends WebMvcConfigurerAdapter {@Overridepublic void configurePathMatch(PathMatchConfigurer configurer) {UrlPathHelper urlPathHelper = new UrlPathHelper();urlPathHelper.setRemoveSemicolonContent(false);configurer.setUrlPathHelper(urlPathHelper);} }現在所有測試都通過了! 請在這里找到本文的源代碼: https : //github.com/kolorobot/spring41-samples
翻譯自: https://www.javacodegeeks.com/2014/07/spring-4-1-and-java-8-java-util-optional.html
總結
以上是生活随笔為你收集整理的Spring 4.1和Java 8:java.util.Optional的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 聚氨酯鞋底好吗 聚氨酯鞋底好不好
- 下一篇: 质量怎么求公式是什么 质量的公式是什么