我在Spring Web MVC 3.0中运行一个webapp,我有许多控制器方法,其签名大致如下:
@RequestMapping(value = "/{level1}/{level2}/foo", method = RequestMethod.POST)
public ModelAndView createFoo(@PathVariable long level1,
@PathVariable long level2,
@RequestParam("foo_name") String fooname,
@RequestParam(value = "description", required = false) String description);
Run Code Online (Sandbox Code Playgroud)
我想添加一些验证 - 例如,description应该限制在一定长度或fooname应该只包含某些字符.如果此验证失败,我想向用户返回一条消息,而不是仅抛出一些未经检查的异常(如果我让数据渗透到DAO层,那么无论如何都会发生这种情况).我知道JSR303,但没有使用它,并不太明白如何在Spring上下文中应用它.
根据我的理解,另一种选择是绑定@RequestBody到整个域对象并在那里添加验证约束,但是目前我的代码被设置为接受如上所示的各个参数.
使用此方法将验证应用于输入参数的最直接方法是什么?
下面是我的spring MVC REST服务中的POST端点.我想使用spring验证框架工作来确保我收到的列表不为空.我该怎么做?我必须在周围提供包装豆listOfLongs吗?
@RequestMapping(value = "/some/path", method = RequestMethod.POST)
@ResponseBody
public Foo bar(@Valid @NotEmpty @RequestBody List<Long> listOfLongs) {
/* if (listOfLongs.size() == 0) {
throw new InvalidRequestException();
}
*/
// do some useful work
}
Run Code Online (Sandbox Code Playgroud)
请求机构应该是什么?
1) [123,456,789]
2) { listOfLongs : [123,456,789]}
Run Code Online (Sandbox Code Playgroud) 我有一个计算器服务,从用户获取操作类型num1和num2.我需要验证用户是否实际输入了这些值,而不是将其留空.
@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);
}
Run Code Online (Sandbox Code Playgroud)
我有一个集成测试,我需要传递,因为它当前失败并出现错误:
{\"timestamp \":1488875777084,\"status \":400,\"error \":\"Bad Request \",\"exception \":\"org.springframework.web.method.annotation.MethodArgumentTypeMismatchException\",""message \":\"无法将'java.lang.String'类型的值转换为必需类型'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\"}"));
}
Run Code Online (Sandbox Code Playgroud)
我不知道如何验证这一点.