我有一个Spring 3.2应用程序,我在基于Spring MVC的this示例之后创建了一个REST API。现在,我在尝试验证不同http方法的某些数据时遇到了一些问题(例如:POST和PUT方法)。
这将是一个非常简化的例子:
public class myItem{
@NotEmpty
private String foo;
@NotEmpty
private String bar;
public myItem(String foo){
this.foo = foo;
this.bar = "";
}
public myItem(String foo, String bar){
this.foo = foo;
this.bar = bar;
}
/* getters & setters omitted */
}
此POJO在不同的请求方法中重复使用。
这将是我简化的控制器:
@Controller
@RequestMapping("/api/item")
public class myItemController{
@RequestMapping(value="/", method=RequestMethod.POST)
@ResponseStatus(HttpStatus.CREATED)
public @ResponseBody myItem createItem(@Valid @RequestBody myItem item){
/* do some stuff */
return item; //inserted item returned
}
@RequestMapping(value="/", method=RequestMethod.PUT)
@ResponseStatus(HttpStatus.NO_CONTENT)
public @ResponseBody myItem createItem(@Valid @RequestBody myItem item){
/* do some stuff */
return item //updated item returned
}
}
在POST方法中,我只期望设置foo字段,因此该请求将失败并带有上述注释。在PUT方法中,我希望设置foo和bar字段,因此该请求将成功完成。
处理这种情况的正确方法是什么:在某种请求方法中,您不希望所有字段都被填满(某些字段可能具有默认值,因此您不希望检查所有字段,又名创建),在另一种方法中,你必须检查所有字段(又名更新)。
答案 0 :(得分:9)
使用验证组:
public interface ValidateOnCreate {}
public interface ValidateOnUpdate {}
public class myItem{
@NotEmpty(groups = { ValidateOnCreate.class, ValidateOnUpdate.class })
private String foo;
@NotEmpty(groups = ValidateOnUpdate.class)
private String bar;
...
}
@RequestMapping(value="/", method=RequestMethod.POST)
@ResponseStatus(HttpStatus.CREATED)
public @ResponseBody myItem createItem(
@Validated(ValidateOnCreate.class) @RequestBody myItem item) { ... }
@RequestMapping(value="/", method=RequestMethod.PUT)
@ResponseStatus(HttpStatus.NO_CONTENT)
public @ResponseBody myItem createItem(
@Validated(ValidateOnUpdate.class) @RequestBody myItem item) { ... }
请注意,在这种情况下,您需要特定于Spring的@Validated
,因为@Valid
不允许您指定组。
另见: