2013-07-03 4 views
6

У меня есть приложение Spring 3.2, и я создал REST API после примера this на основе Spring MVC. Теперь я испытываю некоторые проблемы при попытке проверить некоторые данные для разных методов http (например: POST и PUT).Проверка Spring Rest 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 повторно используется в различных методов запроса.

Это будет мой упрощенный контроллер:

@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 
    } 
} 

В методе POST я только ожидать Foo поле для установки, поэтому этот запрос будет терпеть неудачу с, прежде чем выше аннотаций. В методе PUT я ожидаю, что будут установлены как поля foo, так и bar, поэтому этот запрос будет успешно завершен.

Каков правильный подход к решению подобных ситуаций: в определенном методе запроса вы не ожидаете заполнения всех полей (некоторые поля могут иметь значения по умолчанию, поэтому вы не хотите проверять все их, ака создать), а в другом методе вы должны проверить все поля (aka update).

ответ

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; 
    ... 
} 

.

@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) { ... } 

Обратите внимание, что вам нужно Spring конкретных @Validated в этом случае, поскольку @Valid не позволяет определить группы.

Смотрите также:

+0

Это идеальный ответ. Это был хороший день, когда они внедрили https://jira.springsource.org/browse/SPR-6373 – digitaljoel

+0

так много осталось учиться ... Большое спасибо, спасибо! – jarandaf

Смежные вопросы