Spring MVC: где разместить валидацию и как валидировать ссылки на сущности - PullRequest
1 голос
/ 12 апреля 2010

Допустим, у меня есть следующий командный компонент для создания пользователя:

public class CreateUserCommand {

   private String userName;
   private String email;

   private Integer occupationId;
   pirvate Integer countryId;

}

creationId и countryId - выпадающие выбранные значения в форме. Они сопоставляются с сущностью в базе данных (Род занятий, Страна).

Этот командный объект будет подан на служебный фасад следующим образом:

userServiceFacade.createUser (команда CreateUserCommand);

Этот фасад будет создавать пользовательскую сущность для отправки фактической службе. Поэтому я полагаю, что в слое фасадов мне нужно будет сделать несколько вызовов dao для сопоставления всех свойств поиска объекта User.

Исходя из этого, какова лучшая стратегия для проверки соответствия идентификаторов оккупации и страны реальным объектам? Где лучшее место для проведения этой проверки? Существует пружинный валидатор, но я не уверен, что это лучшее место для этого, поскольку я с осторожностью отношусь к этому методу, так как валидация привязана к веб-уровню, но это также означает, что мне нужно будет делать дао-вызовы в валидаторе для проверки, но мне нужно было бы снова вызывать dao в слое фасада, когда происходит команда -> перевод сущности.

Есть ли что-нибудь, что я могу сделать лучше?

Спасибо.

1 Ответ

3 голосов
/ 14 апреля 2010

Вы уверены, что вам нужен DTO для получения сущности?

Я полагаю, ваш пользователь выглядит следующим образом

public class User implements Serializable {

    private String userName;
    private String email;

    private Occupation occupation;
    private Country country;

}

Обычно ссылка на другую сущность при отображении вашей формы осуществляется с помощью некоторого элемента

public class UserController extends BaseCommandController {

    private OccupationRepository occupationRepository;
    private CountryRepository countryRepository;

    // getter's and setter's (retrieved by Dependency Injection supported by Spring)

    public UserController() {
        setCommandClass(User.class);
        setValidator(new UserValidator());
    }

    public void initBind(HttpServletRequest request, ServletRequestDataBinder binder) {
        binder.registerCustomPropertyEditor(Occupation.class, new PropertyEditorSupport() {

            public void setAsText(String occupationId) {
                // StringUtils belongs to jakarta-commons lang 
                if(StringUtils.isBlank(occupationId)) {
                    setValue(null);

                    return;
                }

                setValue(occupationRepository.getById(Integer.valueOf(occupationId)));
            }

            public String getAsText() {
                if(getValue() == null)
                    return;

                return String.valueOf(((Occupation) getValue()).getId());
            }
        });

        // Same approach when binding Country
    }

}

Обратите внимание Вы можете заменить метод initBind, назначив объект WebBindingInitializer

public class UserBindingInitializer implements WebBindingInitializer {

    private OccupationRepository occupationRepository;
    private CountryRepository countryRepository;

    // getter's and setter's (retrieved by Dependency Injection supported by Spring)

    public void initBinder(WebDataBinder binder, WebRequest request) {
        binder.registerCustomPropertyEditor(Occupation.class, new PropertyEditorSupport() {

            public void setAsText(String occupationId) {
                // StringUtils belongs to jakarta-commons lang 
                if(StringUtils.isBlank(occupationId)) {
                    setValue(null);

                    return;
                }

                setValue(occupationRepository.getById(Integer.valueOf(occupationId)));
            }

            public String getAsText() {
                if(getValue() == null)
                    return;

                return String.valueOf(((Occupation) getValue()).getId());
            }
        });
    }

}

...

public class UserController extends BaseCommandController {

    private OccupationRepository occupationRepository;
    private CountryRepository countryRepository;

    // getter's and setter's (retrieved by Dependency Injection supported by Spring)

    public void setUserBindingInitializer(UserBindingInitializer bindingInitializer) {
        setWebBindingInitializer(bindingInitializer);
    }

И ваш UserValidator (обратите внимание, что ваш Validator больше ничего не знает о каком-либо хранилище)

public class UserValidator implements Validator {

    public boolean supports(Class clazz) {
        return clazz.isAssignableFrom(User.class);
    }

    public void validate(Object command, Errors errors) {
        User user = (User) command;

        if(user.getOccupation() == null)
            errors.rejectValue("occupation", "errors.required", null);

        if(user.getCountry() == null)
            errors.rejectValue("country", "errors.required", null);
    }

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...