2

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

json POST 正文

{"emailAddresses" : []} 

代码

@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 数组,它会直接进入带有空数组列表作为绑定参数的方法。

@Configuration
@EnableWebMvc
@ComponentScan(basePackages = {"com.package.thing"})
public class WeConfiguration extends WebMvcConfigurerAdapter

json POST 正文

{"emailAddresses" : []} 

代码

@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();
}

输出

有错误吗?错误的

试用 3,更改有效负载,工作...但我不认为需要包装?

public class EmailListDTO {

@NotEmpty
private List<String> emailAddresses;

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

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

}

 @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 POST 正文

{"emailAddresses" : []} 

输出

有错误吗?真的

4

1 回答 1

5

@Valid验证参数类类型本身是否javax.validation在字段上具有注释。所以它会使用Validator来扫描List类以获取验证注释,这不是你想要的。

您应该将您包装List<String>成 DTO 并将您的参数更改为

public class MyListDTO {
    @NotEmpty 
    private List<String> emailAddresses;
    ... //getters and setters
}

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

 public void shareThing(@PathVariable(value = "id") final String id, @Valid @RequestBody final MyListDTO myDTO, BindingResult errors )

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

于 2013-10-18T20:54:06.640 回答