当前位置: 首页 > 知识库问答 >
问题:

我应该把需要访问数据库的验证代码放在哪里?

权胜泫
2023-03-14

我有一个用于密码重置的Spring MVC网页。这需要我们执行以下验证工作流程:

>

  • 提供用户名或电子邮件
  • 如果提供了电子邮件,请确保其格式有效(例如:@email)
  • 通过以下方式检查用户是否存在:

    3a)尝试通过用户名从数据库加载用户
    3b)如果通过用户名加载返回null,尝试通过电子邮件从数据库加载用户

    加载后,检查用户是否未被锁定:user。isLocked()

    目前,我在组织中进行了所有这些验证。springframework。验证。验证器

    然而,这要求我的验证器能够访问UserService对象,以便加载用户。这会导致用户被加载2次,一次由我的验证器加载,第二次由我的控制器加载,这样它就可以调用。重置密码(用户)

    问题:我应该在哪里检查第#3项?

    这些验证是否更适合控制器?如果我让验证保持原样,我可以从验证器返回用户吗(由于验证器接口,它有void方法)?


  • 共有3个答案

    上官德寿
    2023-03-14

    也许这是一个重复:Spring MVC Bean验证

    另一个解决方案是:

    在我工作过的一个项目中,我们曾经有一个SpringBeanUtil类。它将获取WebApplication ationContext,并通过静态方法获取所需的bean。这有点丑,但有助于解决这类问题。

    使用风险自负。

    public class SpringBeanUtil implements ApplicationContextAware{
    
    private static ApplicationContext APPLICATION_CONTEXT;
    
    @Override
    public void setApplicationContext(ApplicationContext applicationContext)
            throws BeansException {
        APPLICATION_CONTEXT=applicationContext;
    }
    
    public static Object getBean(String name){
        return APPLICATION_CONTEXT.getBean(name);
    }
    public static <T> T getBean(Class<T> type){
        return APPLICATION_CONTEXT.getBean(type);
    }
    }
    
    长孙兴德
    2023-03-14

    按顺序回答您的问题:

    • 您应该在用户DAO中检查用户的存在
    • ,这些验证不应在控制器中。控制器不应该知道任何有关验证的信息,否则它会试图做得太多,我们会因低内聚性而感到内疚
    • 由于您使用的接口定义了一个带有void return的方法,因此如果您想返回一个用户,您必须执行以下操作之一:
      • 在验证器实现中创建自己的方法。这样做的缺点是,由于依赖于接口中未定义的方法,因此无法有效地使用多态性
      • 创建自己的验证程序(可能创建自己的接口,扩展Spring的验证程序接口并定义所需的方法)。这可能是我会选择的

    万俟心思
    2023-03-14

    在我看来,步骤3和4根本不属于视图层(尤其是控制器执行的验证)。

    对于这个场景,这些步骤是业务逻辑的基本部分,因此它们应该在服务层中实现。

    您的服务层应该提供如下方法:

    public void resetPasswordByUsernameOrEmail(String usernameOrEmail) { ... }
    

    这些步骤应该发生在这个方法中,以及resetPassword(User)

    如果需要,可以通过抛出异常、返回布尔值枚举(如果要区分不同的错误条件),让控制器知道此方法的结果。

     类似资料:
    • 在Vaadin 10-14中,我应该将静态文件放在哪里,例如CSS、JavaScript和聚合模板?静态文件(如图像)如何? 此外,如何在Vaadin中导入这些文件?Vaadin 14与npm和Vaadin 10-13与bower之间有差异吗?

    • 我搜索了很多,几乎所有我发现的例子都使用了控制器中的异常处理和自己的异常处理程序。我一直认为这应该在程序的服务层上完成。如果不是,我真的不明白为什么要创建单独的服务层。 另外,如果我在Controller中实现异常处理,是否意味着我必须在前面的所有层中抛出异常?

    • 问题内容: 设计网页时,应将以下代码放在哪里? 我应该把它放进去还是放进去?请澄清以下问题: 如果将其放在HTML代码中或其他位置,它将产生什么区别? 如果我有两个CSS(或Javascript)文件怎么办?由于我只能在一个文件之前添加一个文件,因此网络浏览器将使用哪个文件来显示网页? 问题答案: 我认为最好的做法是将CSS文件放在标题中 和结束标记之前的Javascript文件 另外,如果有的话

    • 我尝试使用@ControllerAdvise+@ExceptionHandler来捕获ConstraintViolationException,但是它似乎是以前捕获的,抛出的是TransactionSystemException。 验证数据是非常基本的事情,但出于某种原因,在搜索了很多次之后,我还没有找到解决方案。 编辑:显示代码:

    • 以下是在不使用聚合物的情况下运行良好的测试代码: 但我希望在聚合物元素中使用Javascript,并尝试了以下插入: NR 1:脚本标记内的Javascript,模板标记后的Javascript: 我想这意味着,编译器看不到按钮id,因为它在阴影中? 请指示我。