从@Service类处理JSP页面的异常

时间:2014-07-21 15:00:43

标签: java jsp spring-mvc

我正在做Spring MVC,但我不知道如何使用未处理的异常。我想在代码中抛出异常时向用户显示一些自定义错误文本。我不想在web.xml中设置404页面,因为所有异常都会转到一个页面,而这对用户来说没有任何信息。

这可能是一个愚蠢的例子,但我在@Service - 类中有其他代码,这些代码会抛出异常。

@Controller
public class Control {

    @RequestMapping(value = "something", method = RequestMethod.POST)
    public String Form(HttpServletRequest request) {
            String name = request.getParameter("name");

            Validate v = Validate();
            v.giveAName(name);
    }

@Service
public class Validate {

    public void giveAName(String name){
    if (name==null) {
        throw new MyException("Name is null");
      } catch (MyException e) {
        e.getMessage();
    //How do I here pass that getMessage value ("Name is null") back to Control-class
    //(and from there to JSP)?
    }      
}

public class MyException extends Exception {
  public MyException(String message) {
    super(message);
  }
}

2 个答案:

答案 0 :(得分:1)

我可能会从MyException而不是RuntimeException扩展Exception,然后将您的try / catch块放在控制器中。然后你可以在那里抓住MyException。也就是说,通常异常中的错误消息不是向用户显示的最佳信息,因此您可能希望使用spring自定义错误消息执行某些操作。

答案 1 :(得分:1)

Spring MVC有两种干净利落的方式来处理来自服务层的异常。

  • 首先在控制器级别,您可以使用@ExceptionHandler注释方法。将为其声明的任何Exception调用此方法,可以像任何其他控制器方法一样访问请求,响应或会话,并且可以返回视图名称或ModelAndView
  • 接下来在全局级别(由所有控制器共享),您可以设置HandlerExceptionResolver。您应该注意到,默认情况下,DispatcherServlet会注册DefaultHandlerExceptionResolver来处理某些标准的Spring MVC异常。

您可以在Spring reference manual

中找到更多详细信息

编辑:使用@ExceptionHandler的示例:

在服务层中,您只需抛出异常:

@Service
// as MyException is not a RunTimeException it must be declared
public class Validate throws MyException {

    public void giveAName(String name){
    if (name==null) {
        throw new MyException("Name is null"); // not caught locally ...
    }
}

在你的控制器中,你设置一个异常处理程序来捕获异常:

@ExceptionHandler(MyException.class)
public ModelAndView handler(MyException me){
                ModelAndView model = new ModelAndView("index");
                model.addObject("error", me.getMessage());

                return model;
        }
}