您好我有一个如下的弹簧配置文件
<bean id="studentServiceProxy" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
<property name="transactionManager" ref="hibernateTransactionManager" />
<property name="target" ref="studentServiceImpl" />
<property name="transactionAttributes">
<props>
<prop key="*">PROPAGATION_REQUIRED</prop>
</props>
</property>
</bean>
我有一个dao类和服务类,如下所示,
public class StudentDaoImpl extends HibernateDaoSupport implements StudentDao {
public void save(Student student) {
getSession().save(student);
}
}
和
public class StudentServiceImpl implements StudentService {
StudentDao studentDao;
public void setStudentDao(StudentDao studentDao) {
this.studentDao = studentDao;
}
public void saveStudent(Student student) {
studentDao.save(student);
}
}
我有一个像
这样的控制器public class StudentController implements Controller {
StudentService studentService = null;
public void setStudentService(StudentService studentService) {
this.studentService = studentService;
}
public ModelAndView handleRequest(HttpServletRequest request,
HttpServletResponse response) throws Exception {
ModelAndView modelAndView = null;
String studentName = request.getParameter("studentName");
System.out.println("Name:" + studentName);
Student student = new Student();
student.setStudentName(studentName);
studentService.saveStudent(student);
modelAndView = new ModelAndView("success");
return modelAndView;
}
}
我对数据库中的studentname列有一个非空约束。我传递null作为属性(studentname)的值,因此引发了org.hibernate.exception.ConstraintViolationException,在jsp上显示了栈跟踪。
如何在spring配置级别处理此异常?你能帮帮我吧吗?
答案 0 :(得分:0)
您可以在代码中处理异常,而不是在配置中处理异常。即使可能,ConstraintViolationException
也不应被禁止 - 它告诉您正在尝试向数据库添加不一致的数据。
您可以抓住Exception
,也可以通过检查传递给您服务的值来阻止它。
在第一种情况下,您的交易将被回滚。
在第二种情况下,当您处理用户输入时,可以抛出应用程序异常,以便用户可以重试输入有效数据。
答案 1 :(得分:0)
处理API未公开的内部异常是一个坏主意。行为取决于代码的所有者,并且对于每个版本可以是不同的,因为它不是合同。
您应该做的是确保您的数据在传递给API之前通过了必要的验证。根据您定义的规则,您的数据已经非法。所以你的合同已被打破。
在您的情况下,您可以在Student实例上运行验证框架并收集所有验证异常。如果您有任何例外,您可以在模型中传递这些例外并重定向到视图,通知用户问题。