首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Spring控制器jsr 303基本列表验证

Spring控制器jsr 303基本列表验证
EN

Stack Overflow用户
提问于 2013-10-18 20:51:33
回答 1查看 5K关注 0票数 2

我有一个简单的MVC控制器,它接收电子邮件列表,然后向这些电子邮件发送消息。

json桩身

代码语言:javascript
复制
{"emailAddresses" : []} 

代码

代码语言:javascript
复制
@RequestMapping(value = "/{id}/share", method = RequestMethod.POST)
@ResponseBody
public void shareThing(@PathVariable(value = "id") final String id, @Valid @NotEmpty       @RequestBody  final List<String> emailAddresses)

基本上,我想使用jsr-303,这样如果客户端发布没有电子邮件的请求,它就会失败。最好是401。

上述代码是否有效?或者我需要做什么?这是装置。Hibernate验证器在类路径上,所以它应该会被选中。但是,如果我发布一个空的json数组,它将直接进入方法中,其中包含一个空数组列表作为绑定参数。

代码语言:javascript
复制
@Configuration
@EnableWebMvc
@ComponentScan(basePackages = {"com.package.thing"})
public class WeConfiguration extends WebMvcConfigurerAdapter

json桩身

代码语言:javascript
复制
{"emailAddresses" : []} 

代码

代码语言:javascript
复制
@RequestMapping(value = "/{id}/share", method = RequestMethod.POST)
@ResponseBody
public void shareThing(@PathVariable(value = "id") final String id, @Valid @NotEmpty          @RequestBody  final List<String> emailAddresses, BindingResult bindingResult)
{
    System.out.println("Has Errors? " + bindingResult.hasErrors();
}

输出

有错误吗?错误

第三次试验,改变载荷,工作.但我不认为有必要包装?

代码语言:javascript
复制
public class EmailListDTO {

@NotEmpty
private List<String> emailAddresses;

public List<String> getEmailAddresses() {
    return emailAddresses;
}

public void setEmailAddresses(List<String> emailAddresses) {
    this.emailAddresses = emailAddresses;
}

}

代码语言:javascript
复制
 @RequestMapping(value = "/{id}/share", method = RequestMethod.POST)
@ResponseBody
public void shareThing(@PathVariable(value = "id") final String id, @Valid             @RequestBody  EmailListDTO emailListDTO, BindingResult bindingResult)
{
    System.out.println("Has Errors? " + bindingResult.hasErrors();
} 

json桩身

代码语言:javascript
复制
{"emailAddresses" : []} 

输出

有错误吗?真的

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-10-18 20:54:06

@Valid验证参数类类型本身是否在字段上有javax.validation注释。因此,它将使用Validator扫描List类以获得验证注释,这不是您想要的。

您应该将您的List<String>封装到DTO中,并将参数更改为

代码语言:javascript
复制
public class MyListDTO {
    @NotEmpty 
    private List<String> emailAddresses;
    ... //getters and setters
}

@Valid不仅使其失败,还将错误绑定到BindingResult对象。如果向处理程序方法添加BindingResult参数(必须在@Valid参数旁边)

代码语言:javascript
复制
 public void shareThing(@PathVariable(value = "id") final String id, @Valid @RequestBody final MyListDTO myDTO, BindingResult errors )

然后,您可以检查BindingResult中的错误,并选择要执行的操作。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19458844

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档