我没有从现有的答案中得到正确的理解我有完全基于表单的Web应用程序,其中我有一个弹簧控制器为每个表单。
公共基类,具有所有服务类实例的varible(singleton object)声明代码(以避免在每个控制器中声明bo成员变量,用于业务服务交互),这是所有控制器的父级。
具有所有dao服务实例的变量(单例对象)声明代码的公共基类,它是所有BO类的父类。
具有HibernateTemplate的变量(单例对象)声明代码的公共基类,使用@Autowired annotaions的SessionFactory.Which是所有dao类的父类。以上三个具有Logger对象实例的类的父类。
一个fbisExceptionHandler.java,它从所有控制器捕获所有@RequestMapping方法的异常,如下所示
@ControllerAdvice
public class ExceptionControllerAdvice
{
@ExceptionHandler(Exception.class)
public ModelAndView exception(Exception e)
{
ModelAndView mav = new ModelAndView("exception");
mav.addObject("name", e.getClass().getSimpleName());
logger.error( e.getMessage())
mav.addObject("message", e.getMessage());
return mav;
}
}
请回答我的问题
1)这个单一的方法是否适用于处理所有异常.i,那些陷入控制器,服务类,dao类的人?
2)为什么我的所有hibernate dao的方法都没有使用try..catch块或者在方法签名时抛出声明....是不是hibernate dao没有抛出任何异常?如果是这样他们抓住了什么?
例如我的一个hibernate dao是
3)如何处理来自db供应商的所有constarints?有没有内置的hibernate?
4)为什么我的所有bo的方法都没有使用try..catch块或者在方法签名处抛出声明....哪里确实抛出异常并被捕获?
My sample dao
package com.fbis.form18.daoimp;
all imports
@Repository
public class Form18daoImp implements Form18Dao{
@Autowired
SessionFactory sessionFactory;
HibernateTemplate hibernateTemplate;
@Autowired
public void setSessionFactory(SessionFactory sessionFactory)
{
this.hibernateTemplate=new HibernateTemplate(sessionFactory);
}
public void save(Form18Dtls form18dtls) {
sessionFactory.getCurrentSession().save(form18dtls);
logger.info("Form18Dtls saved successfully");
}
@Override
public Form18Dtls findbyFacId(String facID) {
@SuppressWarnings("rawtypes")
List list=hibernateTemplate.find("from Form18Dtls where FAC_ID=?", facID);
logger.info("findbyFacId ran successfully");
return (Form18Dtls)list.get(0);
}
all dao's methods are continued here..
}
My sample bo
package com.fbis.form18.boimp;
all imports
@Service("form18Bo")
public class Form18boImp implements Form18Bo
{
@Autowired
Form18Dao form18dtlsdao;
@Transactional
public void save(Form18Dtls from18dtls)
{
String UniqueTransactionNumber=getFacId(from18dtls.getFacDistrict(),"Form18_Dtls");
from18dtls.setFacId(UniqueTransactionNumber);
from18dtls.setSubmtdDate(new java.util.Date());
from18dtls.setAppStatus("I");
from18dtls.setFormId(23);
form18dtlsdao.save(from18dtls);
}
public String getFacId(String district,String tableName)
{
FacIdGenerator facid=new FacIdGenerator();
String genFacid=facid.factoryIdCreator("F18", district, tableName);
logger.info("getFacId ran successfully");
return genFacid;
}
@Override
public Form18Dtls findbyFacId(String facID) {
return form18dtlsdao.findbyFacId(facID);
}
other bo's continued here
如果我关注错误的课程,欢迎提出建议,提前致谢
答案 0 :(得分:1)
如果我理解正确,你的问题围绕着从数据访问层抛出的异常,在这种情况下,你使用hibernate作为你的供应商。
如果是这样,那么这是关于已检查异常和未经检查的异常的纯Java问题。 Hibernate异常是未经检查的(扩展RuntimeException),因此不需要在方法签名上声明它们,也不需要捕获它们。最重要的是,可以告诉Spring将特定的供应商(例如hibernate)异常转换为Spring DataAccessException(参见http://docs.spring.io/spring/docs/4.0.x/spring-framework-reference/html/dao.html)。
关于您上面的编号问题: