Spring Rest API validation



我有一个Spring3.2应用程序,并根据这个基于SpringMVC的示例创建了一个RESTneneneba 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字段,这样这个请求就会成功完成。

处理这种情况的正确方法是什么:在某个请求方法中,你不希望所有字段都被填满(有些字段可能有默认值,因此你不想检查所有字段,也就是创建),而在另一种方法中,必须检查所有字段(也就是更新)。

使用验证组:

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不允许您指定组。

另请参阅:

  • JSR 303:Bean验证4.1.2。组

最新更新