@RequestParam с опциональным Spring REST - PullRequest
0 голосов
/ 15 апреля 2020

У меня есть конечная точка 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 Идентификатор и имя должны быть Optional.of (1) и Optional.empty (), но когда я отлаживаю в реализации остальных API, я вижу, id и name был обернут со значениями Optional[Optional[1]] и Optiona[Optional.empty]].

Я знаю, что могу использовать @RequestParams (обязательно = false), но я не хочу использовать этот способ в этом контексте.

Как нам развернуть Optional[Optional[1]] Optiona[Optional.empty]] Это правильно? Любые предложения, пожалуйста?

Заранее спасибо!

Ответы [ 2 ]

1 голос
/ 15 апреля 2020

Это потому, что вы передаете необязательный параметр в параметре запроса, который снова оборачивается необязательным на уровне контроллера. Попробуйте следовать и проверьте.

@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();                                                           
} 
0 голосов
/ 15 апреля 2020

Это работает. Я поставил значение по умолчанию для параметра 'name'

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();                                                           
} 

Спасибо всем за предложения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...