【问题标题】:Spring Boot add if statement in every action in controllerSpring Boot 在控制器的每个操作中添加 if 语句
【发布时间】:2020-11-25 15:58:17
【问题描述】:

我需要根据服务的某些条件重定向控制器中的每个操作。

示例:

@RestController
public class MyController{

    @Autowired
    private MyService myService;

    @GetMapping("/action1")
    public String action1() {
        if(myService.checkIfError()) {
            return "redirect:/error";
        } else {
            // specific code of action1
        }
    }

    @GetMapping("/action2")
    public String action2() {
        if(myService.checkIfError()) {
            return "redirect:/error";
        } else {
            // specific code of action2
        }
    }
}

action1action2 上面的代码都有一些特定的代码,但部分代码 if(myService.checkIfError())return "redirect:/error";} 与所有操作相同。

谁能告诉我如何删除这个样板代码,以便保留特定于操作的代码?

【问题讨论】:

  • 您可以通过使用一些查询参数或路径参数来区分实现。另一种方法可能是您可以将错误检查逻辑移动到单独的方法并在任何地方重用它。
  • 请您演示答案的第一部分吗?错误检查逻辑已设置在服务中的“checkIfError”函数中。

标签: java spring-boot controller boilerplate


【解决方案1】:

您可以为此使用过滤器

@Component
public class YourFilter implements Filter {

    @Autowired
    private MyService myService;

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain)
            throws IOException, ServletException {

        HttpServletResponse httpServletResponse = (HttpServletResponse) servletResponse;

        if (myService.checkIfError()) {
            httpServletResponse.sendRedirect("/error");
            return;
        }

        filterChain.doFilter(servletRequest, servletResponse);
    }
}

Spring Boot 会自动装配这个过滤器,它会拦截所有请求。

【讨论】:

  • 是否需要将此过滤器自动连接到控制器中或自动完成?
  • 这将应用于所有控制器的所有请求;控制器不需要知道它。
  • 我怎样才能防止它被应用到所有控制器?我只需要将此过滤器应用于所需的控制器。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-09-04
  • 1970-01-01
  • 2022-10-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多