簡體   English   中英

Spring MVC Controller JSR 303基本列表驗證

[英]Spring mvc controller jsr 303 basic list validation

我有一個簡單的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" : []} 

產量

有錯誤嗎? 真正

@Valid驗證參數類類型本身是否在字段上具有javax.validation批注。 因此,它將使用Validator掃描List類以獲取驗證注釋,這不是您想要的。

您應該將List<String>包裝到DTO中,並將參數更改為

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

@Valid不僅使它失敗, BindingResult錯誤綁定到BindingResult對象。 如果添加,請在處理程序方法中添加BindingResult參數(該參數必須位於@Valid參數旁邊)

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

然后,您可以檢查BindingResult是否有錯誤,然后選擇要執行的操作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM