2017-06-04 84 views
0

我有一堆休息控制器的驗證請求重複代碼。例如:對於每個控制器

@RequestMapping(path="/{groupId}",method=RequestMethod.PUT) 
public void update(@RequestBody GroupDto groupDto, @PathVariable long groupId, Principal principal, BindingResult result) throws IOException { 
    updateGroupDtoValidator.validate(groupDto, result); 
    if (result.hasErrors()) { 
     throw new ValidationException(); 
    } 
    groupService.update(groupId, groupDto, principal.getName()); 
} 

在每個方法控制器中,我必須重複進行調用以驗證並檢查結果是否有錯誤。有沒有更好的辦法?是否可以配置@Validated以驗證來自客戶端的輸入數據?

UPDATE1我有幾個驗證。例如,我有UpdateGroupDtoValidator,它在傳遞給Update Rest端點時驗證GroupDto對象。我還有一個驗證CreateGroupDtoValidator時DTO傳遞給Create REST端點這驗證GroupDto

+0

這可能是一些做援助https://stackoverflow.com/questions/12195015/java-annotation-to-execute-some-code-before-and-after-method 雖然這是你正在尋找可能的內容:Spring MVC的攔截器( http://viralpatel.net/blogs/spring-mvc-interceptor-example/) –

+0

你應該考慮使用@Valid註解這裏http://www.baeldung.com/spring-mvc-custom-validator解釋。 – Mustafa

+0

@Mustafa AFAIK'@ Valid'根據它所屬的類中使用的註釋驗證對象。我無法做到這一點,因爲我根據不同的場景對一個類的對象進行了不同的驗證。請參閱Update1 –

回答

0

可以定義Spring MVC Interceptor將顧名思義截取您的通話,他們到達控制器之前,你可以在這一點上進行的驗證。

+0

春季攔截器是否攔截所有呼叫?我有不同的端點,他們使用不同的dto,並且每個端點對不同的場景使用不同的驗證器。我不認爲使用攔截器是一個好主意。 –

+0

是的,它是這樣做的,並基於更新它不會解決您的問題,至少不健康的方式,sbjavateam解決方案是你所需要的。 –