Проверка Spring 3.1. Как использовать @valid, если у вас есть две отдельные модели для отправки и сохранения формы.

У меня есть две отдельные модели AccountDetailsForm и AccountDetails, первая для отправки формы, а вторая для сохранения.

Форма Детали Аккаунта:

public class AccountDetailsForm {

    private AccountDetails accountDetails;

    @NotNull
    private String confirmPassword;

    //setter and getters
}

и сведения об учетной записи:

@Entity
@Table(name = "ACCOUNT")
public class AccountDetails {

    @Id
    @Column(name = "USER_NAME")
    @NotEmpty
    @Max(value = 60)
    private String userName;


    @Column(name = "PASSWORD")
    @NotEmpty
    @Min(value = 8)
    private String password;

   //setters and getters
}

Теперь я проверяю отправленную форму, используя @Valid:

@RequestMapping(value="userRegistration", method = RequestMethod.POST)
public ModelAndView registerUser(@Valid AccountDetailsForm accountDetailsForm, BindingResult result,Model model){

    //I autowire localValidatorFactoryBean to validate the fields in AccountDetails bean.
    localValidatorFactoryBean.validate(accountDetailsForm.getAccountDetails(), result);

    if (result.hasErrors()){
        model.addAttribute("accountDetailsForm", new AccountDetailsForm());
        model.addAllAttributes(result.getModel());
        return new ModelAndView("userRegistration");
    }

Я использую спящий режим для настойчивости. Есть ли способ проверить bean-компонент accountDetails с помощью @Valid вместо явного вызова метода validate() или использования реализации весеннего валидатора?

Я не против услышать предложения по обходному пути confirmPassword. Я следую текущему подходу, потому что не имеет смысла иметь в модели поле confirmPassoword.


person shazinltc    schedule 23.08.2012    source источник
comment
Какой тип класса Java является «моделью модели». Это весенний класс mvc или тот, который вы написали?   -  person emeraldjava    schedule 09.10.2014


Ответы (2)


Поместите @Valid в AccountDetails объект AccountDetailsForm:

public class AccountDetailsForm {

    @Valid
    private AccountDetails accountDetails;

    @NotNull
    private String confirmPassword;

        //setter and getters
}

Когда AccountDetailsForm проверяется с помощью @Valid в вашем контроллере, AccountDetails также будет проверено.

Справочный пример здесь .

person jelies    schedule 23.08.2012
comment
Спасибо за ответ, но это не работает. В объекте BindingResult по-прежнему нет ошибок! - person shazinltc; 23.08.2012
comment
Только что добавил пример из справочника по валидатору спящего режима, проверьте его. Вы используете этот импорт? javax.validation.constraints.NotNull - person jelies; 23.08.2012
comment
У вас есть спящий валидатор jar в вашем пути к классам? - person Varun Achar; 23.08.2012
comment
Нет, я использую проверку гибернации @NotEmpty. - person shazinltc; 23.08.2012
comment
Проверьте этот вопрос stackoverflow.com/questions/7545231/ - person Varun Achar; 23.08.2012
comment
Можно использовать org.hibernate.validator.constraints.NotEmpty (лучше, чем @NotNull в строках). Проверьте ссылку @VarunAchar, может вам помочь. - person jelies; 23.08.2012
comment
Да, у меня есть и валидатор hibernarte, и API-интерфейс проверки (javax.validation). - person shazinltc; 23.08.2012
comment
спящий валидатор 4.2 и валидация API 1.0.0. - person shazinltc; 23.08.2012
comment
на каком сервере приложений вы запускаете свое приложение? - person jelies; 23.08.2012
comment
Я запускаю его на tomcat. Я попытался использовать @valid на обычном компоненте (без графа объектов), он отлично работает. Проблема только с проверкой графа объектов. - person shazinltc; 23.08.2012
comment
Возможно, это не вызывает проблемы, но, глядя на ваш класс AccountDetails, помните, что для проверки размера String вы должны использовать @Size(min=X, max=Y). @Max и @Min используются для проверки чисел (см. ссылка< /а>). Возможно, по этой причине проверка имени пользователя и пароля AccountDetails не срабатывает. - person jelies; 23.08.2012
comment
Я пробовал с NotBlank, но не показывает ошибок, вместо этого выдает исключение при сохранении - person shazinltc; 23.08.2012
comment
Наконец-то я выяснил причину: D Я использовал экземпляр валидатора Spring 3, так как мне пришлось выполнить и некоторые другие проверки :) Когда я удалил это, он отлично работает. Спасибо. - person shazinltc; 07.04.2013

Посмотрите на поле групп внутри аннотаций: вы можете указать, какие зависимые классы следует применять. Здесь может быть что-то вроде этого:

@Valid(groups=AccountDetails.class)

С maven я в настоящее время использую эти версии библиотек в проекте Spring MVC 3.1:

springframework 3.1.2.RELEASE
javax.validation 1.0.0.GA
hibernate-validator-annotation-processor 4.1.0.Final
person BendaThierry.com    schedule 23.08.2012
comment
Это правда, не понял... В любом случае вы можете добавить @NotEmpty(groups=...) и @Size(groups=...) в поля Account && AccountDetails вашего графа объектов. Может быть, посмотрите и на свои DAO: правила должны совпадать. - person BendaThierry.com; 23.08.2012
comment
@Valid не принимает группы, но начиная с версии 3.1 появилась аннотация Spring @Validated({...}), которая работает таким же образом и принимает группы (SPR-6373) - person Maciej Majewski; 04.09.2013