[英]@RequestParam with Optional Spring REST
我有一個 Spring REST 端點,可選請求參數如下:
public ResponseEntity<Product> globalProduct(@RequestParam Optional<Integer> id, @RequestParam Optional<String> name){
return ResponseEntity.ok(tm));
}
當我嘗試測試使用 Mockito 框架的端點時
@Test
public void testGlobalProduct() throws Exception {
URI uri = UriComponentsBuilder.fromPath("/api/products")
.queryParam("id", Optional.of(1)
.queryParam("name", Optional.empty())
.build().toUri();
mockMvc.perform( MockMvcRequestBuilders.get(uri)
.accept(MediaType.APPLICATION_JSON))
.andExpect(status().isOk())
.andExpect(content().contentType(MediaType.APPLICATION_JSON))
.andDo(MockMvcResultHandlers.print())
.andReturn();
}
所以 queryParams id 和名稱應該是 Optional.of(1) 和 Optional.empty(),但是當我在 rest api 實現中調試時,我看到id
和name
已經用值Optional[Optional[1]]
和 Optiona Optiona[Optional.empty]]
。
我知道我可以使用 @RequestParams(required=false) 但我不想在這種情況下使用這種方式。
我們如何解包Optional[Optional[1]]
Optiona[Optional.empty]]
這是正確的嗎? 請問有什么建議嗎?
提前致謝!
那是因為您在查詢參數中傳遞了一個 Optional,它再次包裝在 controller 層的可選中。 嘗試關注並檢查。
@Test
public void testGlobalProduct() throws Exception {
URI uri = UriComponentsBuilder.fromPath("/api/products")
.queryParam("id", 1)
.build().toUri();
mockMvc.perform( MockMvcRequestBuilders.get(uri)
.accept(MediaType.APPLICATION_JSON))
.andExpect(status().isOk())
.andExpect(content().contentType(MediaType.APPLICATION_JSON))
.andDo(MockMvcResultHandlers.print())
.andReturn();
}
它的工作。 我為參數“名稱”設置了默認值
public ResponseEntity<Product> globalProduct(@RequestParam Optional<Integer> id, @RequestParam(value = "") Optional<String> name){
return ResponseEntity.ok(tm));
}
而且我沒有從測試中傳遞任何 requestParam,所以它默認為空。 有用。
@Test
public void testGlobalProduct() throws Exception {
URI uri = UriComponentsBuilder.fromPath("/api/products")
.queryParam("id", Optional.of(1)
.build().toUri();
mockMvc.perform( MockMvcRequestBuilders.get(uri)
.accept(MediaType.APPLICATION_JSON))
.andExpect(status().isOk())
.andExpect(content().contentType(MediaType.APPLICATION_JSON))
.andDo(MockMvcResultHandlers.print())
.andReturn();
}
感謝大家的建議。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.