【问题标题】:Redirect inside java interceptor在java拦截器内重定向
【发布时间】:2015-08-22 06:16:58
【问题描述】:

我想为错误代码处理创建拦截器,它将重定向到 Spring MVC 应用程序中的正确错误页面。问题是错误代码来自服务,它在请求处理程序内部处理,所以我可能需要拦截服务而不是请求处理程序。 例如:

@RequestMapping(value = "/products", method = RequestMethod.GET)
public ModelAndView handleProducts(ModelAndView mav) {
        //do something
        ...
        //load products
        ResponseMo response = productsService.getProducts();
        //process the response
        mav.addObject("products", response.getData());
        ...
        /do something else
        return mav;
}

我需要的是捕获getProducts()的响应,如果有错误响应,我需要重定向...项目中,有很多这样的处理程序和服务调用,所以我需要解决它地方。 ProductsService 是项目的一部分,同一个耳朵。 我在考虑拦截器、过滤器、方面......我可以拦截 getProducts() 调用,但我不能在拦截器内重定向,或者我可以吗?还是我应该使用一些不同的方法?

【问题讨论】:

  • 是否应该针对任何失败的服务方法重定向到同一页面?
  • Sotirios:是的,现在根据项目规范,只有一页,所有例外情况都相同。但是你知道,有可能会有新的请求重定向到不同的页面...

标签: java spring spring-mvc servlets interceptor


【解决方案1】:

https://spring.io/blog/2013/11/01/exception-handling-in-spring-mvc

创建适合您的业务案例的自定义异常,然后在控制器中处理异常。希望对您有所帮助。

【讨论】:

  • 我应该在哪里抛出异常?问题是服务不返回异常而是简单的错误代码(字符串)。所以可能我应该创建拦截器,它会抛出由@ExceptionHandler 处理的异常。听起来不错,谢谢..
  • 拦截器的用途完全不同。你想捕捉什么样的异常?如果它们是未经检查的异常,则不能在方法签名中声明它们。所以您可以像上一个链接中的示例一样在控制器中处理它们,它们处理可以从他们的服务中引发的@ExceptionHandler({SQLException.class,DataAccessException.class})
  • 问题是 productsService 没有引发异常(来自上面的示例),只有错误代码。我无法改变这种行为。所以我不能使用@ExceptionHandler,因为没有异常......我想的是在一些拦截器中创建它们,这可能不是好的行为,但我现在看不到任何其他可能的解决方案。
  • 您始终可以检查从 productService 引发的此错误代码并引发自定义异常。某种像http错误代码。 if (code >= 500) throw new ServerErrorException(); if (code >= 400) throw new ClientErrorException(); 或者我没有做对。
  • 是的,但是我必须在许多请求处理程序中执行此操作,这就是为什么我需要在拦截器中执行此操作 - 在一个地方而不是每个处理程序中检查代码。
猜你喜欢
  • 2015-11-22
  • 2017-11-28
  • 2014-05-24
  • 2021-12-17
  • 2014-12-23
  • 2013-03-11
  • 2012-03-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多