引发运行时异常时如何回滚Spring声明式事务(纯XML)

时间:2014-05-06 06:51:16

标签: spring hibernate spring-mvc

您好我有一个如下的弹簧配置文件

<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配置级别处理此异常?你能帮帮我吧吗?

2 个答案:

答案 0 :(得分:0)

您可以在代码中处理异常,而不是在配置中处理异常。即使可能,ConstraintViolationException也不应被禁止 - 它告诉您正在尝试向数据库添加不一致的数据。

您可以抓住Exception,也可以通过检查传递给您服务的值来阻止它。

在第一种情况下,您的交易将被回滚。

在第二种情况下,当您处理用户输入时,可以抛出应用程序异常,以便用户可以重试输入有效数据。

答案 1 :(得分:0)

处理API未公开的内部异常是一个坏主意。行为取决于代码的所有者,并且对于每个版本可以是不同的,因为它不是合同。

您应该做的是确保您的数据在传递给API之前通过了必要的验证。根据您定义的规则,您的数据已经非法。所以你的合同已被打破。

在您的情况下,您可以在Student实例上运行验证框架并收集所有验证异常。如果您有任何例外,您可以在模型中传递这些例外并重定向到视图,通知用户问题。