Spring Rest API验证

jar*_*daf 6 spring spring-mvc

我有一个Spring 3.2应用程序,我在这个基于Spring MVC的例子后创建了一个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 */

}
Run Code Online (Sandbox Code Playgroud)

此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
    }
}
Run Code Online (Sandbox Code Playgroud)

在POST方法中,我只期望设置foo字段,因此该请求将在上面的注释之前失败.在PUT方法中,我希望设置foo和bar字段,因此该请求将成功完成.

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

axt*_*avt 9

使用验证组:

public interface ValidateOnCreate {}
public interface ValidateOnUpdate {}
Run Code Online (Sandbox Code Playgroud)

.

public class myItem{ 
    @NotEmpty(groups = { ValidateOnCreate.class, ValidateOnUpdate.class })
    private String foo;

    @NotEmpty(groups = ValidateOnUpdate.class)
    private String bar;
    ...
}
Run Code Online (Sandbox Code Playgroud)

.

@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) { ... }
Run Code Online (Sandbox Code Playgroud)

请注意,@Validated在这种情况下您需要特定于Spring的,因为@Valid不允许您指定组.

也可以看看: