Java SpringMVC:在何处放置验证以及如何验证实体引用

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是表单上下拉选择的值。它们映射到数据库中的实体(职业、国家) 此命令对象将被馈送到服务外观,如下所示:

假设我有以下用于创建用户的命令bean:

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);
    }

}