【问题标题】:Spring mvc controller jsr 303 basic list validationSpring mvc 控制器 jsr 303 基本列表验证
【发布时间】:2013-10-19 05:29:21
【问题描述】:

我有一个简单的 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" : []} 

输出

有错误吗?真的

【问题讨论】:

  • 正文中只有一个 json 数组。 POST 请求。将内容类型设置为 application/json。它在有值并填充列表时起作用——据我所知,它正在正确解析它。

标签: java spring spring-mvc bean-validation


【解决方案1】:

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

您应该将您的 List&lt;String&gt; 包装到 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 是否有错误并选择要执行的操作。

【讨论】:

  • 仍然不适合我。添加了更新。你说的是这个吗?
  • @Matt 是的,我错过了一些东西。给我一点时间。
  • @Matt 查看我的编辑。将您的 List 包装在一个包含您要使用的 javax.validation 注释的类中。
  • 好的,这按编辑工作。但天哪,这在我看来是矫枉过正。我不需要整个 dto,我不想像这样将列表包装在 json 对象中:{“emailAddresses”:[]}。有什么办法吗?
  • @Matt 变通方法更加矫枉过正:) Spring 使用这个名为HandlerMethodArgumentResolver 的接口为您的处理程序方法提供参数。您必须创建并注册您的自定义解析器。这种方式,即使是矫枉过正,也是唯一的默认方式。
猜你喜欢
  • 2013-12-27
  • 2011-05-10
  • 2018-08-15
  • 2011-04-30
  • 2014-09-28
  • 2013-11-23
  • 1970-01-01
  • 1970-01-01
  • 2017-06-02
相关资源
最近更新 更多