【问题标题】:Spring. How exception translation works?春天。异常翻译如何工作?
【发布时间】:2017-01-23 07:56:23
【问题描述】:

我有以下代码:

@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"/>

翻译异常就够了吗?我应该实施自定义翻译器吗?

如果能得到示例代码就好了。

【问题讨论】:

  • 你试过了吗?这将回答这个问题。

标签: java spring exception-handling repository


【解决方案1】:

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

在你的web应用中,你需要做两件事来实现异常翻译。

首先,在配置文件中配置 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();

  //you will chose a dialect that you are using for your project.
  adapter.setDatabasePlatform("org.hibernate.dialect.MySQL5InnoDBDialect");  

  LocalContainerEntityManagerFactoryBean factory = 
      new LocalContainerEntityManagerFactoryBean();
  factory.setJpaVendorAdapter(adapter);
  factory.setDataSource(this.springJpaDataSource());

  //the packages that contains you @Repositories annotations
  factory.setPackagesToScan("packagenames"); 

  factory.setSharedCacheMode(SharedCacheMode.ENABLE_SELECTIVE);
  factory.setValidationMode(ValidationMode.NONE);
  factory.setJpaPropertyMap(properties);
  return factory;
}

此类LocalContainerEntityManagerFactoryBean 实现PersistenceExceptionTranslator。所以你已经完成了第一步。

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

【讨论】:

  • 这种大小的摘录可能被视为侵犯版权。不相关的文字也太多了。
  • 正是我需要的!谢谢!
猜你喜欢
  • 2014-12-21
  • 1970-01-01
  • 2017-09-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多