【问题标题】:Spring mvc - Use modelAttribute inside method instead of method argument as annotationSpring mvc - 在方法内部使用modelAttribute而不是方法参数作为注释
【发布时间】:2019-04-01 20:33:54
【问题描述】:

以下是代码 sn-p,我们可以在方法参数级别使用 @ModelAttribute

    @ReqestMapping(value = useruri)
    public void submitInfo(@ModelAttribute User user) {
       // Business logic
    }

    @ReqestMapping(value = personuri)
    public void submitInfo(@ModelAttribute Person person) {
       // Business logic
    }

我们可以像下面这样吗?

   @RequestMapping(value = genericuri)
    public void submitInfo(HttpServletRequest request, @PathVariable String type) {
           if (type.equals("user")) {
                User user = someSpringMvcMethod(request, User.class)
            } else if (type.equals("person")) {
                Person person = someSpringMvcMethod(request, Person.class)
            }
         //Business logic

    }

原因是,我期待基于类型的不同类型的提交数据,我想编写一个通用控制器,因为唯一的区别是将请求数据转换为特定的 java 类。 User 和 Person 类有很多不同的数据,我认为我不能在这里使用继承/多态来解决我的用例

【问题讨论】:

    标签: java spring-mvc modelattribute


    【解决方案1】:

    我不推荐这样的事情。
    看这里

    if (type.equals("user")) {
        User user = someSpringMvcMethod(request, User.class)
    } else if (type.equals("person")) {
        Person person = someSpringMvcMethod(request, Person.class)
    }
    

    这已经错了,恕我直言。管理多个模型的单一方法。
    如果您需要其他模型的类型怎么办?另一个if 分支。

    例如,这好多了

    @ReqestMapping("base-path/user")
    public void submitInfo(@ModelAttribute final User user) {
       commonLogic(user.valueOne, user.valueTwo);
    }
    
    @ReqestMapping("base-path/person")
    public void submitInfo(@ModelAttribute final Person person) {
       commonLogic(person.valueOne, person.valueTwo);
    }
    
    private void commonLogic(final String one, final String two) {
       ... // Business logic
    }
    

    commonLogic 管理模型类型之间的通用业务逻辑。
    它集中了工作。
    您甚至可以将commonLogic 放在Service 中,无论如何它都应该放在这个位置。

    【讨论】:

    • 好的,谢谢。我知道 if-else 方法很糟糕。另一种选择是,我可以用类型和相应类的哈希图替换它。但主要是我想看看方法内部是否有任何可用的注释替代方法。但是非常感谢你的建议。我将主要采用上述常用方法。
    • @mihirS 使用 HashMap 方法,无论如何您都必须维护硬编码初始化。我会说,将通用业务逻辑放在一个服务中,并在控制器中自动装配服务。这是最干净的解决方案(也是我通常自己做的)。
    猜你喜欢
    • 2021-04-12
    • 1970-01-01
    • 2018-01-10
    • 2014-09-20
    • 1970-01-01
    • 1970-01-01
    • 2017-08-03
    • 2012-12-02
    相关资源
    最近更新 更多