Java SpringMVC:在何处放置验证以及如何验证实体引用
假设我有以下用于创建用户的命令bean:Java SpringMVC:在何处放置验证以及如何验证实体引用,java,spring,spring-mvc,validation,Java,Spring,Spring Mvc,Validation,假设我有以下用于创建用户的命令bean: public class CreateUserCommand { private String userName; private String email; private Integer occupationId; pirvate Integer countryId; } occupationId和countryId是表单上下拉选择的值。它们映射到数据库中的实体(职业、国家) 此命令对象将被馈送到服务外观,如下所示:
public class CreateUserCommand {
private String userName;
private String email;
private Integer occupationId;
pirvate Integer countryId;
}
occupationId和countryId是表单上下拉选择的值。它们映射到数据库中的实体(职业、国家)
此命令对象将被馈送到服务外观,如下所示:
createUser(CreateUserCommand命令)
这个facade将构造一个用户实体以发送到实际的服务。因此,我假设在facade层中,我必须进行几个dao调用来映射用户实体的所有查找属性
基于此,验证occupationId和countryId映射到真实实体的最佳策略是什么?执行此验证的最佳位置在哪里?有spring验证器,但我不确定这是最好的地方,因为我对这种方法很谨慎,因为验证与web层有关,但这也意味着我需要在验证器中进行dao调用以进行验证,但是当命令->实体转换发生时,我需要再次调用facade层中的dao
有什么我能做得更好的吗
谢谢。您确定需要DTO来检索实体吗 我想你的用户如下
public class User implements Serializable {
private String userName;
private String email;
private Occupation occupation;
private Country country;
}
通常,在显示表单时对另一个实体的引用是通过使用感谢回复来实现的。DTO的原因是域(hibernate)对象非常复杂,有很多关系、方法等。这里的用户示例仅用于说明。这就是为什么我想屏蔽域中的表示层。在这种情况下,我需要执行上面描述的验证,因为我不想公开实体。我曾计划使用Validator,尽管这会将验证逻辑放在web层上,这对我来说似乎是可疑的。除非验证器不应该只进行简单的字段检查?@arrages验证器设计用于执行简单的验证。类似于isInteger、ISNOBLANK、isNotNull之类的东西,其他什么都没有。当使用复杂验证时,最好将其放在业务逻辑中。注意,正如你自己所说,我也使用了非常复杂的关系和方法,没有问题。
<select name="occupation">
<option name="0">A occupaation</option>
<option name="1">Other occupaation</option>
<option name="2">Another occupaation</option>
</select>
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
}
}
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);
}
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);
}
}