Вы уверены, что вам нужен 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);
}
}