Spring 3, JSR-303 (проверка бинов) и проверка коллекции - PullRequest
4 голосов
/ 12 января 2012

У меня есть простой класс Foo, говорящий так:

public class Foo {
    @NotNull
    private String bar;
    public String getBar(){ return bar; }
    public void setBar(String _bar){ this.bar = _bar; }
}

Теперь у меня есть метод REST контроллера, который принимает массив (или коллекцию) Foos, где я хочу убедиться, что у каждого Foo есть свойство, отличное от null bar. Я думал, что использование аннотации @Valid поможет, но, похоже, это не так:

@Controller
public class MyController {
    @RequestMapping(value="/foos", method=RequestMethod.POST)
    public @ResponseBody String createFoos(@Valid @RequestBody Foo[] foos){
        // blah blah blah
        return "yeah";
    }
}

Примечание: со списком также не работает. Но с уникальным Foo это работает!

Похоже, что проверка Spring не работает, когда у нас есть "несколько" объектов (в коллекции или массиве).

Я даже пытался реализовать HandlerMethodArgumentResolver с пользовательской аннотацией, но я не знаю, как определить «индексированные имена свойств» в BindingResult.

Если кто-то знает обходной путь для этой проблемы, он будет очень признателен! :)

1 Ответ

0 голосов
/ 24 января 2012

Есть несколько вещей, которые, я думаю, вы упустили в своей реализации. Вы захотите использовать понятие графов объектов, чтобы сделать эту работу.

Ваш класс Foo имеет проверку @NotNull в одном из своих полей, однако вы не совсем указали, что нужно проверять с коллекцией.

Из спящего режима Ссылка:

Проверка графа объекта также работает для полей с типом коллекции. Это означает, что любые атрибуты, которые являются массивами, реализуют java.lang.Iterable (особенно Collection, List и Set) или реализовать java.util.Map можно аннотировать с помощью @Valid, что приведет к проверке каждого содержащегося в нем элемента при проверке родительского объекта.

Таким образом, ваш код станет

@Controller
public class MyController {
    @RequestMapping(value="/foos", method=RequestMethod.POST)
    public @ResponseBody String createFoos(@Valid @NotNull @RequestBody Foo[] foos){
        // blah blah blah
        return "yeah";
    }
}
...