2013-07-03 7 views
6

스프링 3.2 애플리케이션이 있고 스프링 MVC를 기반으로 한 this 예제 다음에 REST API를 만들었습니다. 이제 다른 http 메소드 (예 : POST 및 PUT 메소드)에 대한 데이터의 유효성을 검사하는 동안 몇 가지 문제가 발생했습니다.스프링 레스트 API 유효성 확인

public class myItem{ 

    @NotEmpty 
    private String foo; 

    @NotEmpty 
    private String bar; 

    public myItem(String foo){ 
     this.foo = foo; 
     this.bar = ""; 
    } 

    public myItem(String foo, String bar){ 
     this.foo = foo; 
     this.bar = bar; 
    } 

    /* getters & setters omitted */ 

} 

이 POJO는 다른 요청 방법에 재사용 :

이 꽤 간단한 예 것이다.

이 내 단순화 컨트롤러 것 : 만 foo는 필드가 설정 될 것으로 예상되는 POST 방법에

@Controller 
@RequestMapping("/api/item") 
public class myItemController{ 

    @RequestMapping(value="/", method=RequestMethod.POST) 
    @ResponseStatus(HttpStatus.CREATED) 
    public @ResponseBody myItem createItem(@Valid @RequestBody myItem item){ 
     /* do some stuff */ 
     return item; //inserted item returned 
    } 

    @RequestMapping(value="/", method=RequestMethod.PUT) 
    @ResponseStatus(HttpStatus.NO_CONTENT) 
    public @ResponseBody myItem createItem(@Valid @RequestBody myItem item){ 
     /* do some stuff */ 
     return item //updated item returned 
    } 
} 

때문에,이 요청은 위의 주석 전에 실패 할 것입니다. PUT 메소드에서 foo와 bar 필드가 모두 설정되기를 기대하기 때문에이 요청은 성공적으로 완료됩니다.

이러한 상황을 처리하는 올바른 방법은 무엇입니까? 특정 요청 방법에서 모든 필드가 채워질 것으로 예상하지는 않습니다 (일부 필드는 기본값을 가질 수 있으므로 모든 필드를 검사하지 않으려합니다. 그들, 일명 창조), 그리고 다른 방법에서 당신은 모든 필드 (일명 업데이 트)를 확인해야합니다.

답변

9

를 사용하여 유효성 검사 그룹 :

public interface ValidateOnCreate {} 
public interface ValidateOnUpdate {} 

.

public class myItem{ 
    @NotEmpty(groups = { ValidateOnCreate.class, ValidateOnUpdate.class }) 
    private String foo; 

    @NotEmpty(groups = ValidateOnUpdate.class) 
    private String bar; 
    ... 
} 

. 이 경우 @Validated 봄 특정 필요

@RequestMapping(value="/", method=RequestMethod.POST) 
@ResponseStatus(HttpStatus.CREATED) 
public @ResponseBody myItem createItem(
    @Validated(ValidateOnCreate.class) @RequestBody myItem item) { ... } 

@RequestMapping(value="/", method=RequestMethod.PUT) 
@ResponseStatus(HttpStatus.NO_CONTENT) 
public @ResponseBody myItem createItem(
    @Validated(ValidateOnUpdate.class) @RequestBody myItem item) { ... } 

주, @Valid 때문에 그룹을 지정할 수 없습니다.

은 참조 :

+0

이 완벽한 대답이다. 그들이 https://jira.springsource.org/browse/SPR-6373 – digitaljoel

+0

을 배웠기 때문에 좋은 날이었습니다. 배울 점이 많았습니다 ... 감사합니다. 감사합니다! – jarandaf

관련 문제