Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jsp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 处理@Service类中JSP页面的异常_Java_Jsp_Spring Mvc - Fatal编程技术网

Java 处理@Service类中JSP页面的异常

Java 处理@Service类中JSP页面的异常,java,jsp,spring-mvc,Java,Jsp,Spring Mvc,我正在做SpringMVC,但我不知道如何处理未处理的异常。我想在代码中抛出异常时向用户显示一些自定义错误文本。我不想在web.xml中设置一个404页面,因为这样所有的异常都会转到一个页面,而这对用户来说并不是信息 这可能是一个愚蠢的例子,但我的@Service-类中还有其他代码抛出异常 @Controller public class Control { @RequestMapping(value = "something", method = RequestMethod.POST

我正在做SpringMVC,但我不知道如何处理未处理的异常。我想在代码中抛出异常时向用户显示一些自定义错误文本。我不想在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);
  }
}

我可能会从
RuntimeException
扩展
MyException
,而不是
Exception
,然后将try/catch块放在控制器中。然后您可以在那里捕获MyException。也就是说,异常中的错误消息通常不是向用户显示的最佳方式,因此您可能需要对spring自定义错误消息进行处理。

spring MVC有两种干净整洁的方法来处理来自服务层的异常

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

编辑:使用
@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;
        }
}

我不能将try/catch块放到控制器上,因为它在架构上看起来很糟糕。@TomJoad为什么?对于你所有的东西来说,这是一个特殊的例外还是一个普通的例外?谢谢你的评论!我想你把我推向了正确的方向,但我仍然无法解决它。令人沮丧的。我现在得到的是: