2017-03-07 19 views
2

我有一個計算器服務,獲取用戶的操作類型num1和num2。我需要驗證用戶是否實際輸入了這些值,並且不會將其留空。如何驗證@RequestParams不是空的?

@RequestMapping(value = "/calculate") 
@ResponseBody 
public CalculationResult calculate(@RequestParam(name = "op") String operation, @RequestParam(name = "num1") Double num1, @RequestParam(name = "num2") Double num2) { 
    System.out.print("Operation:" + operation); 
    Double calculate = calculatorService.calculate(operation, num1, num2); 
    return new CalculationResult(calculate); 
} 

我有一個集成測試,我需要做通,因爲它目前正與錯誤而失敗:

{\"timestamp\":1488875777084,\"status\":400,\"error\":\"Bad Request\",\"exception\":\"org.springframework.web.method.annotation.MethodArgumentTypeMismatchException\",\"message\":\"Failed to convert value of type 'java.lang.String' to required type 'java.lang.Double';

下面是我的測試案例:

@Test 
public void validates_all_parameters_are_set() throws Exception { 
    ResponseEntity<String> response = template.getForEntity("/calculate?op=&num1=&num2=", 
      String.class); 
    assertThat(response.getStatusCode(), equalTo(HttpStatus.BAD_REQUEST)); 
    assertThat(response.getBody(), equalTo("{\"error\":\"At least one parameter is invalid or not supplied\"}")); 
} 

我不知道如何驗證這一點。

+0

要傳遞NUM2作爲值NUM1;這應該是'/ calculate?op =&num1 =&num2 =' –

+0

謝謝,當我修復,我得到一個「java.lang.AssertionError: 預計:<400> 但:是<200>」 – Saakina

+1

簡單的方法是包裹所有prams bean並使用@valid。 [請點擊此處](http://stackoverflow.com/a/26233302/1038268) – Raghu

回答

1

到目前爲止您不檢查數值;你可以更改您的代碼:

import org.springframework.http.HttpStatus; 
import org.springframework.http.ResponseEntity; 

@RequestMapping(value = "/calculate") 
@ResponseBody 
public ResponseEntity<CalculationResult> calculate(@RequestParam(name = "op") String operation, 
    @RequestParam(name = "num1") Double num1, 
    @RequestParam(name = "num2") Double num2) { 

    if(null == op || null == num1 || null == num2) { 
     throw new IllegalArgumentException("{\"error\":\"At least one parameter is invalid or not supplied\"}") 
    } 

    System.out.print("Operation:" + operation); 
    Double calculate = calculatorService.calculate(operation, num1, num2); 

    return new ResponseEntity<>(new CalculationResult(calculate), HttpStatus.OK); 
}  

@ExceptionHandler(IllegalArgumentException.class) 
@ResponseStatus(HttpStatus.BAD_REQUEST) 
public final String exceptionHandlerIllegalArgumentException(final IllegalArgumentException e) { 
    return '"' + e.getMessage() + '"'; 
} 
+0

當我添加這個,並運行我在問題中提到的測試時,測試失敗:「java.lang.AssertionError: Expected:」{\「error \」:\「至少有一個參數無效或未提供\「}」 但是:爲空「 – Saakina

+0

您的服務代碼正在返回一個CalculationResult對象,但您的測試期望得到一個String;這是不一致的。我改變了我的答案,以便使用ExceptionHandler。我沒有編譯它;希望我沒有任何錯別字 –

+0

非常感謝,它的工作。謝謝謝謝!!!! – Saakina

2

我回答類似的問題here,你可以按照你寫測試,以及不久,如下:

@Validated 
public class CalculationController { 

    @RequestMapping(value = "/calculate") 
    @ResponseBody 
    public CalculationResult calculate(
      @Valid @NotBlank @RequestParam(name = "op") String operation, 
      @Valid @NotNull @RequestParam(name = "num1") Double num1, 
      @Valid @NotNull @RequestParam(name = "num2") Double num2) { 
     System.out.print("Operation:" + operation); 
     Double calculate = calculatorService.calculate(operation, num1, num2); 
     return new CalculationResult(calculate); 
    } 
} 

相應@Test應該進行修改,以測試爲陣列「可以不爲空」消息,如:

@Test 
public void validates_all_parameters_are_set() throws Exception { 
    ResponseEntity<String> response = template.getForEntity("/calculate?op=&num1=&num2=", 
       String.class); 
    assertThat(response.getStatusCode(), equalTo(HttpStatus.BAD_REQUEST)); 
    assertThat(response.getBody(), equalTo("{\"error\":[\"may not be null\",\"may not be null\"]}")); 
}