2017-01-23 3 views
2

я следующий код:Весна. Как работает перевод исключений?

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

Достаточно перевести исключение? Должен ли я использовать пользовательский переводчик?

Было бы неплохо получить пример кода.

+0

Вы попробовали? Это ответит на вопрос. – zapl

ответ

0

В принципе, Spring Framework и другие связанные с Spring проекты (такие как Spring Data NoSQL) определяют сложную иерархию персистентности, наследующую от org.springframework .dao.DataAccessException. Эта иерархия заботится обо всем исключении, которое выбрасывается JDBC, Hibernate, другими реализациями ORM и JPA и т. Д.

В вашем веб-приложении вам нужно сделать две вещи, чтобы добиться перевода исключений.

Во-первых, настройте org.springframework.dao.support .PersistenceExceptionTranslator реализацию в ваших конфигурационных файлах. Вы можете сделать это путем определения боб LocalContainerEntityManagerFactoryBean в корневом классе конфигурации, как это:

@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; 
} 

Этот класс реализует LocalContainerEntityManagerFactoryBeanPersistenceExceptionTranslator. Итак, вы позаботились о первом шаге.

Второй шаг - пометить ваши репозитории/сущности аннотацией @Repository. Это говорит Spring, что аннотированный компонент имеет право на трансляцию исключений, используя сконфигурированный PersistenceExceptionTranslators. Если методы репозитория выкидывают любые ошибки , то PersistenceExceptionTranslators переводит эти исключения, если это необходимо.

+0

Отрывок такого размера можно считать нарушением авторских прав. Это слишком много несвязанного текста. – zapl

+0

Точно то, что мне нужно! Спасибо! – iGreetYou