弹簧。异常翻译如何运作?

时间:2017-01-23 07:56:24

标签: java spring exception-handling repository

我有以下代码:

@Repository
public class UserDAOImpl implements UserDAO {
    public void addUser(User user) {
        throw new HibernateException("unchecked exception");
    }
}

@Service
public class UserServiceImpl implements UserService {

    @Autowired
    private UserDAO userDAO;

    @Override
    public void addUser(User user) {
        try {
            userDAO.addUser(user);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

的web.xml:

<context:component-scan base-package="org.example.dao,
                                      org.example.services"/>
<mvc:annotation-driven />
<bean class="org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor"/>

翻译异常是否足够?我应该实现自定义翻译吗?

获得示例代码会很好。

1 个答案:

答案 0 :(得分:0)

基本上,Spring Framework和其他Spring相关的项目(例如Spring Data NoSQL)定义了从org.springframework .dao.DataAccessException继承的持久性异常的彻底层次结构。此层次结构负责处理JDBC,Hibernate,其他ORM实现和JPA等引发的所有异常。

在您的网络应用程序中,您需要做两件事来实现异常翻译。

首先,在配置文件中配置org.springframework.dao.support .PersistenceExceptionTranslator实现。您可以通过在根配置类中定义LocalContainerEntityManagerFactoryBean的bean来完成此操作,如下所示:

@Bean
public LocalContainerEntityManagerFactoryBean entityManagerFactoryBean()
{
Map<String, Object> properties = new Hashtable<>();
properties.put("javax.persistence.schema-generation.database.action",
"none");
HibernateJpaVendorAdapter adapter = new HibernateJpaVendorAdapter();
adapter.setDatabasePlatform("org.hibernate.dialect.MySQL5InnoDBDialect"); //you will chose a dialect that you are using for your project. 
LocalContainerEntityManagerFactoryBean factory =
new LocalContainerEntityManagerFactoryBean();
factory.setJpaVendorAdapter(adapter);
factory.setDataSource(this.springJpaDataSource());
factory.setPackagesToScan("packagenames"); //the packages that contains you @Repositories annotations
factory.setSharedCacheMode(SharedCacheMode.ENABLE_SELECTIVE);
factory.setValidationMode(ValidationMode.NONE);
factory.setJpaPropertyMap(properties);
return factory;
}

此课程LocalContainerEntityManagerFactoryBean实施PersistenceExceptionTranslator。所以你已经完成了第一步。

第二步是使用@Repository注释标记您的存储库/实体。这告诉Spring,带注释的bean有资格使用 已配置PersistenceExceptionTranslators。如果存储库方法抛出任何持久性 例外情况,PersistenceExceptionTranslators会根据需要翻译这些例外情况。