簡體   English   中英

@RequestParam 可選 Spring REST

[英]@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 實現中調試時,我看到idname已經用值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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM