【问题标题】:How to ensure mandatory parameters are passed into a Spring MVC controller method?如何确保将强制参数传递给 Spring MVC 控制器方法?
【发布时间】:2014-01-10 09:14:17
【问题描述】:

给定一个 Spring-MVC 控制器方法:

@RequestMapping(value = "/method")
public void method(@RequestParam int param1,
                   @RequestParam int param2) { /*...*/ }

如果请求URL中缺少参数,则报错,例如:

JBWEB000068:消息所需的 int 参数“param1”不存在

我需要将参数移动到单个模型类中,但要保持完全相同的 GET 请求 URL。于是将method的参数修改为MyModel model,其中包含param1param2

如果@RequestParam 被省略但问题是如果缺少参数则不会报告错误,则此方法有效。另一方面,如果包含@RequestParam,则在 GET 请求中需要一个名为“model”的参数。有没有办法强制模型参数但保持相同的请求 URL?

【问题讨论】:

    标签: java spring spring-mvc parameters bean-validation


    【解决方案1】:

    使用 JSR-303 注释来验证对象(在这种情况下,不要使用原语,而是使用对象表示)。

    public class MyObject {
        @NotNull
        private Integer param1;
    
        @NotNull
        private Integer param2;
    
        // Getters / Setters
    
    }
    

    控制器方法。

    @RequestMapping(value = "/method")
    public void method(@Valid MyObject obj) { /*...*/ }
    

    如果您的类路径中没有 JSR-303 提供程序(例如 hibernate-validator),请创建一个 Validator 并使用它来验证您的对象。

    链接。

    1. Spring MVC reference guide
    2. 春季验证reference guide

    【讨论】:

    • 只是建议,如果您将信息与您的解决方案一起添加为“为什么他在省略@RequestParam 时没有收到任何错误并在添加回时收到错误”。 - 这可能有助于他理解 spring 如何处理模型 Object as Request 背后的基础,例如stackoverflow.com/questions/8372957/…
    • @MDeinum 非常感谢您的解决方案 - 我对这种类型的东西很陌生,之前没有遇到过 JSR-303。不错的紧凑语法,很不错!
    【解决方案2】:

    你可以试试@ModelAttribute 和method=RequestMethod.POST: 在您的控制器中:

    //...
    @RequestMapping(value="/method", method=RequestMethod.POST)
    public String add(@ModelAttribute("modelName") ModelClass form)
    {
       //.. your code
    }
    
    //..
    

    在您的 JSP 中:

    <%@ taglib uri="http://www.springframework.org/tags/form" prefix="f" %>
    
    //.. some code 
    
    <f:form action="method" method="post" modelAttribute="modelName">
    
    </f:form>
    

    如果您仅限于 GET 请求,您可能无法使用单独的 ModelClass。在这种情况下,您需要求助于请求参数。

    【讨论】:

    • 您好,感谢您的回答。实际方法必须是 GET 请求并返回 JSON 数据(因此 JSP 位不相关)。已尝试使用@ModelAttribute,但似乎没有任何区别 - 未报告缺少参数错误。
    猜你喜欢
    • 1970-01-01
    • 2015-01-25
    • 2022-10-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多