javaspring-bootjunit4bean-validationjsr

How do I validate that the @RequestParams are not empty?


I have a calculator service that gets the operation type, num1 and num2 from the user. I need to validate that the user actually inputs these values and doesn't just leave it blank.

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

I have an Integration test that I need to make pass as it is currently failing with error:

{\"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';

Below is my Test Case:

@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\"}"));
}

I don't know how to validate this.


Solution

  • You do not check the values up to now; you could change your code to:

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