向Spring MVC发送许多参数(所有参数都是可选的)

时间:2015-11-21 07:29:41

标签: hibernate spring-mvc

考虑在Spring MVC之上的应用程序,它显示表中模型列表的字段。您可以根据某些条件筛选表行。以下是一个示例屏幕截图(摘自Redmine问题跟踪系统,但对其余讨论并不重要):

sample filters

现在,请注意所有过滤器都是可选的:我可以在搜索中自由包含/不包含每个过滤器。 MVC控制器的工作是检测请求中是否存在过滤器,并返回正确的模型(与ORM解决方案一起使用,在我的例子中是Hibernate)。

相当繁琐的过程是控制器使用switch-case / if-else结构来检测请求中是否存在过滤器。

  

有更好的解决方案吗?例如,有没有办法让控制器接受一些对象,其中Spring(通过适当的配置)将请求映射到该对象的字段,然后控制器可以正确地将此对象传递给Hibernate以获取模型列表?

为简单起见,请假设我们要过滤“问题”表(如上图所示),“问题”模型是以下POJO:

// for simplicity, annotations are removed
public class Issue {
    long id;
    Boolean status;
    float done;
    long author_Id; // foreign key

    //getters and setters
    ...
}

1 个答案:

答案 0 :(得分:1)

所以,是的,正如评论中所述,这绝对是一个更好的解决方案。

使用当前的状态技术(java8,spring 4.1 +,标准api),您可以在Controller中使用Java的Optional - Container。使用isPresent,您可以传递这样的参数:

public void getResults(@RequestParam("filter") Optional<String> filter) {
    ...

    // or call a method only if filter is present:
    filter.ifPresent(value -> item.setFilter(value));

    //or a similar call via method reference
    //filter.ifPresent(this::setFilter);

    ...
}

要让where - 子句使用动态过滤值,我建议使用Criteria - API