Ale*_*Man 1 java spring jsp spring-mvc
我在Spring MVC中创建了一个用于测试回滚和提交功能的应用程序.我正在使用Transaction.在服务中,我创建了另一个联系人对象,但未指定员工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";
}
Run Code Online (Sandbox Code Playgroud)
服务
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;
}
Run Code Online (Sandbox Code Playgroud)
编辑
@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";
}
Run Code Online (Sandbox Code Playgroud)
您永远不应该让服务层中抛出的异常直接到达用户浏览器.正如Vinit Prajapati所建议的那样,您可以配置一个HandlerExceptionResolver在异常情况下显示适当视图的方法.您还可以使用一个控制器异常处理机制,其中包含一个或多个带@ExceptionHandler注释的方法,这些方法将在配置的异常情况下触发,并且几乎可以像@RequestMapping注释方法一样使用.在最后一个ressort中,您可以在控制器方法中使用显式的try-catch块.
Spring Framework参考手册中的提取:您在控制器中使用@ExceptionHandler方法注释来指定在执行控制器方法期间抛出特定类型的异常时调用哪个方法... @ExceptionHandler值可以设置为异常类型数组.如果抛出的异常与列表中的某个类型匹配,那么将调用使用匹配的@ExceptionHandler注释的方法...就像使用@RequestMapping批注注释的标准控制器方法一样,@ ExceptionHandler的方法参数和返回值方法非常灵活...返回类型可以是String,它被解释为视图名称或ModelAndView对象.
在我自己的代码中,我使用@ExceptionHandler来处理一般错误,例如无法访问的数据库,但是如果我想处理真正由业务规则引起的异常并且我更愿意<form:errors>在视图中使用标记,那么在控制器中使用try-catch块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);
}
Run Code Online (Sandbox Code Playgroud)
与"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";
}
Run Code Online (Sandbox Code Playgroud)
与去年结构,你会显示对应的错误消息,DUPKEY在您的配置MessageSource就像在你的JSP鉴于全球其他错误豆通过标签<form:errors/>没有path在里面.
<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>
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
6331 次 |
| 最近记录: |