Mat*_*uis 2 java spring spring-mvc bean-validation
我有一个简单的MVC控制器,它接收一个电子邮件列表,然后会向这些电子邮件发送一条消息.
{"emailAddresses" : []}
Run Code Online (Sandbox Code Playgroud)
@RequestMapping(value = "/{id}/share", method = RequestMethod.POST)
@ResponseBody
public void shareThing(@PathVariable(value = "id") final String id, @Valid @NotEmpty @RequestBody final List<String> emailAddresses)
Run Code Online (Sandbox Code Playgroud)
基本上,我想使用jsr-303,这样如果客户端发布没有电子邮件的请求,它就会失败.最好是401.
上述代码应该有效吗?或者我需要做什么?这是设置.Hibernate验证器在类路径上,因此它应该正常运行.但是,如果我发布一个空的json数组,它会直接进入方法,并将一个空数组列表作为绑定参数.
@Configuration
@EnableWebMvc
@ComponentScan(basePackages = {"com.package.thing"})
public class WeConfiguration extends WebMvcConfigurerAdapter
Run Code Online (Sandbox Code Playgroud)
{"emailAddresses" : []}
Run Code Online (Sandbox Code Playgroud)
@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();
}
Run Code Online (Sandbox Code Playgroud)
有错误吗?假
public class EmailListDTO {
@NotEmpty
private List<String> emailAddresses;
public List<String> getEmailAddresses() {
return emailAddresses;
}
public void setEmailAddresses(List<String> emailAddresses) {
this.emailAddresses = emailAddresses;
}
Run Code Online (Sandbox Code Playgroud)
}
@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();
}
Run Code Online (Sandbox Code Playgroud)
{"emailAddresses" : []}
Run Code Online (Sandbox Code Playgroud)
有错误吗?真正
@Valid验证参数类类型本身是否javax.validation在字段上有注释.因此,它将使用Validator扫描List类进行验证注释,这不是您想要的.
您应该将自己包装List<String>到DTO中并将参数更改为该参数
public class MyListDTO {
@NotEmpty
private List<String> emailAddresses;
... //getters and setters
}
Run Code Online (Sandbox Code Playgroud)
@Valid不只是让它失败,它将错误绑定到一个BindingResult对象.如果添加一个BindingResult参数添加到处理程序方法(它必须在您的@Valid参数旁边)
public void shareThing(@PathVariable(value = "id") final String id, @Valid @RequestBody final MyListDTO myDTO, BindingResult errors )
Run Code Online (Sandbox Code Playgroud)
然后,您可以检查BindingResult错误并选择要执行的操作.
| 归档时间: |
|
| 查看次数: |
4809 次 |
| 最近记录: |