gpt4 book ai didi

Spring Rest API 验证

转载 作者:行者123 更新时间:2023-12-03 12:11:37 26 4
gpt4 key购买 nike

我有一个 Spring 3.2 应用程序,我在 this 之后创建了一个 REST API。基于 Spring MVC 的示例。现在我在尝试验证不同 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 :
@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 Validation 4.1.2. groups
  • 关于Spring Rest API 验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17453253/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com