我在Spring MVC中创建了一个用于测试回滚和提交功能的应用程序。我正在使用Transaction。在服务中,我创建了另一个联系人对象,但未指定员工ID,这是必填字段。保存和回滚正在运行时,异常处理时应用程序正常工作。
但问题是Exception正在我的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";
}
答案 0 :(得分:5)
您应该从不让服务层中抛出的异常直接到达用户浏览器。根据Vinit Prajapati的建议,您可以配置HandlerExceptionResolver
,以便在出现异常时显示相应的视图。您还可以使用每个控制器异常处理机制,其中包含一个或多个@ExceptionHandler
带注释的方法,这些方法将在配置的异常情况下触发,并且几乎可以像@RequestMapping
带注释的方法一样使用。在最后一个ressort中,您可以在控制器方法中使用显式的try-catch块。
Spring Framework参考手册中的摘录:在控制器中使用@ExceptionHandler方法注释来指定在执行控制器方法期间抛出特定类型的异常时调用哪个方法... @ExceptionHandler value可以设置为Exception类型的数组。如果抛出的异常与列表中的某个类型匹配,那么将调用使用匹配的@ExceptionHandler注释的方法...就像使用@RequestMapping批注注释的标准控制器方法一样,@ ExceptionHandler的方法参数和返回值方法非常灵活...返回类型可以是String,它被解释为视图名称或ModelAndView对象。
在我自己的代码中,我使用@ExceptionHandler来处理一般错误,例如无法访问的数据库,但是如果我想处理真正由业务规则引起的异常并且我优先使用{{1},那么在控制器中使用try-catch块在视图中标记,在控制器中明确地调用<form:errors>
。
编辑:具体例子
假设您希望在Errors.reject()
在控制器中
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);
}
导致jsp,其中"duplicate"
将显示异常消息。当然,要使用它,您的服务必须抛出DataIntegrityViolationException ...
如果您偏好在普通视图中显示错误,则可以改为
${msg}
使用最后一个构造,您将在配置的@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";
}
bean中显示与DUPKEY
对应的错误消息,就像jsp视图中的其他全局错误一样,通过标记MessageSource
而不是{{1}在它里面。
<form:errors/>
答案 1 :(得分:4)
创建一个基本控制器类(你的其他人扩展),例如尝试这个方法(虽然你想用不同的方法处理不同的错误,但这会让你开始):
/*
* 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
}