Java SpringMVC-在视图中显示异常(JSP页面)

Java SpringMVC-在视图中显示异常(JSP页面),java,spring,jsp,spring-mvc,Java,Spring,Jsp,Spring Mvc,我在SpringMVC中创建了一个应用程序,用于测试回滚和提交功能。我正在使用事务处理。在服务中,我创建了另一个contact对象,但没有指定employee id(必填字段)。当保存和回滚工作时出现异常时,应用程序工作正常 但问题是在我的jsp页面中打印的是异常 有人能告诉我一些防止在te视图中显示异常的解决方案吗 控制器 @RequestMapping(value="/saveContact", method=RequestMethod.POST) public String create(

我在SpringMVC中创建了一个应用程序,用于测试回滚和提交功能。我正在使用事务处理。在服务中,我创建了另一个contact对象,但没有指定employee id(必填字段)。当保存和回滚工作时出现异常时,应用程序工作正常

但问题是在我的jsp页面中打印的是异常

有人能告诉我一些防止在te视图中显示异常的解决方案吗

控制器

@RequestMapping(value="/saveContact", method=RequestMethod.POST)
public String create(@ModelAttribute("newContact")Contacts contact, BindingResult result, SessionStatus status)
{
    validator.validate(contact, result);
    if (result.hasErrors()) 
    {               
        return "newContact";
    }
    contactsDAO.save(contact);
    status.setComplete();
    return "redirect:viewAllContacts.do";
}
服务

public int save(Contacts contact)
{
    int i = 0;
    try
    {
        i = (Integer) sessionFactory.getCurrentSession().save(contact);
        Contacts contacts =new Contacts();
        contacts.setAddress("ABCD");
        contacts.setMobile("8181");
        i = (Integer) sessionFactory.getCurrentSession().save(contacts);
    }
    catch(Exception exception)
    {
        exception.printStackTrace();
    }
    return i;
}
编辑

@RequestMapping(value="/saveContact", method=RequestMethod.POST)
public String create(@ModelAttribute("newContact")Contacts contact, BindingResult result, SessionStatus status) throws SQLException
{
    validator.validate(contact, result);
    if (result.hasErrors()) 
    {               
        return "newContact";
    }
    try {
        contactsDAO.save(contact); 
    }
    catch (Exception ex) {
        System.out.println("enrtered");
        result.reject("DUPKEY");
        ex.printStackTrace();
        return "redirect:saveContact.do";
    } 
    status.setComplete();
    return "redirect:viewAllContacts.do";
}

您应该永远不要让服务层中抛出的异常直接到达用户浏览器。根据Vinit Prajapati的建议,您可以配置一个
HandlerExceptionResolver
,在发生异常时显示适当的视图。您还可以使用带有一个或多个
@ExceptionHandler
注释方法的每个控制器异常处理机制,该方法在配置异常时将被激发,并且几乎可以像
@RequestMapping
注释方法一样使用。在最后一次重新排序时,可以在控制器方法中使用显式的try-catch块

摘自Spring Framework参考手册:您可以在控制器中使用@ExceptionHandler方法注释来指定在控制器方法执行期间引发特定类型的异常时调用哪个方法。。。@ExceptionHandler值可以设置为异常类型数组。如果抛出的异常与列表中的某个类型匹配,则将调用使用匹配的@ExceptionHandler注释的方法。。。很像用@RequestMapping注释的标准控制器方法,@ExceptionHandler方法的方法参数和返回值非常灵活。。。返回类型可以是字符串,可以解释为视图名称或ModelAndView对象

在我自己的代码中,我使用@ExceptionHandler处理常规错误,例如不可访问的数据库,但如果我想处理真正由业务规则引起的异常,并且我更喜欢在视图中使用
标记,明确地调用controller中的
errors.reject()
,则在controller中使用try-catch blocs

编辑:具体例子

假设您希望在出现
DataIntegrityViolationException

内部控制器

@ExceptionHandler(value = {DataIntegrityViolationException.class})
public ModelAndViewexceptionHandler(Exception ex, Locale locale) {
    String msg = ex.getMessage();
    // or if you have a I18n app : String msg = messageSource.getMessage("DUPKEY", null, locale);
    return new ModelAndView("duplicate", "msg", msg);
}
通过
“duplicate”
导致一个jsp,其中
${msg}
将显示异常消息。当然,要使其工作,您的服务必须抛出DataIntegrityViolationException

如果您希望在普通视图中显示错误,则可以改为显示

@RequestMapping(value="/saveContact", method=RequestMethod.POST)
public String create(@ModelAttribute("newContact")Contacts contact, BindingResult result, SessionStatus status)
{
    validator.validate(contact, result);
    if (result.hasErrors()) 
    {               
        return "newContact";
    }
    try {
        contactsDAO.save(contact);
    }
    catch (DataIntegrityViolationException ex) {
        result.reject("DUPKEY");
        return "newContact";
    }
    status.setComplete();
    return "redirect:viewAllContacts.do";
}
使用最后一个构造,您将通过标记
在jsp视图中显示与配置的
MessageSource
bean中的
DUPKEY
对应的错误消息,该标记中没有
路径

<form:form>
      <%-- Show global errors (notably DUPKEY) --%>
      <form:errors/>
      <table>
          <tr>
              <td>Address:</td>
              <td><form:input path="address" /></td>
              <%-- Show errors for address field --%>
              <td><form:errors path="address" /></td>
          </tr>
...
</form:form>

地址:
...

创建一个基本控制器类(由其他人扩展),例如尝试此方法(尽管您希望用不同的方法处理不同的错误,但这将帮助您开始):


检查/配置spring异常resolver@user3145373ツ 事实上,正如我所说,我已经创建了一个异常来检查回滚功能。您是否可以解释什么是异常,如果它是您在服务中捕获的异常(以及它是如何被重试的),以及什么意思:在我的jsp中打印?它是否出现在预期页面的中间,而不是预期页面?@ SergBalLista看到这里的异常不是问题,而是说我们在事务中有一些异常,因为我正在使用<代码>事务事务> /代码>不需要显式地定义事务。所以,当异常发生时,它抛出并向用户显示该异常,而不是如何告诉用户某些事情已经发生了wrong@SergeBallesta同样的,但我没有得到任何解决方案,请您指定一些与上述代码相关的代码,但从我的服务中,我将如何通过该代码控制异常?您可以向我展示一个与上述应用程序相关的示例吗?您可以向我展示一个与上述应用程序相关的示例吗它的阻碍,因为我觉得即使你在
contactsDAO.save(contact)中放了一个try-catch因此,每当发生异常时,如果我们返回到newContact或viewAllContacts视图,而在第二个示例的介绍中添加了相应的错误消息,则会捕获异常,并在该捕获块中捕获异常。这些示例是独占的:您可以使用带有专用于异常显示的视图的
@ExceptionHandler
,或者您使用catch块并在同一个视图中不断显示错误。这意味着当发生某些异常时,如果我们想将其显示到专用的公共异常视图中,我们可以使用
@ExceptionHandler
,否则如果我们想在同一个视图中显示,我们可以通过catch本身返回。谢谢!!,还有一件事,也就是说,如果我们想将错误消息从catch块传递到我们呈现的同一个视图,我们如何通过bindingsresult或任何其他方式来实现呢
    /*
 * Default exception handler, catches all exceptions, redirects to friendly
 * error page and send e-mail does not catch request mapping errors
 */
@ExceptionHandler (Exception.class)
public String myExceptionHandler(final Exception e) {
    final StringWriter sw = new StringWriter();
    final PrintWriter pw = new PrintWriter(sw);
    e.printStackTrace(pw);
    final String strStackTrace = sw.toString(); // stack trace as a string
    logger.error(strStackTrace); // send to logger first
    emailService.sendAlertMail(strStackTrace);
    return "exception"; // default friendly exception message for user
}