java - method - spring service exception handling
Primavera. ¿Cómo funciona la traducción de excepción? (1)
Básicamente, Spring Framework y otros proyectos relacionados con Spring (como Spring Data NoSQL) definen una jerarquía completa de excepción de persistencia que hereda de org.springframework .dao.DataAccessException . Esta jerarquía se ocupa de todas las excepciones lanzadas por JDBC, Hibernate, otras implementaciones de ORM y JPA, etc.
En su aplicación web, debe hacer dos cosas para lograr la traducción de excepción.
Primero, configure las implementaciones de org.springframework.dao.support .PersistenceExceptionTranslator en sus archivos de configuración. Puede hacer esto definiendo un bean de LocalContainerEntityManagerFactoryBean en su clase de configuración raíz de esta manera:
@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;
}
Esta clase LocalContainerEntityManagerFactoryBean implementa PersistenceExceptionTranslator . Así que has cuidado el primer paso.
El segundo paso es marcar tus repositorios / entidades con la anotación @Repository
. Esto le dice a Spring que el bean anotado es elegible para la traducción de excepción utilizando los PersistenceExceptionTranslators
configurados. Si los métodos del repositorio arrojan cualquier excepción de persistencia, los PersistenceExceptionTranslators
traducen esas excepciones según corresponda.
Tengo el siguiente código:
@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"/>
¿Es suficiente traducir la excepción? ¿Debo implementar un traductor personalizado?
Sería bueno obtener un código de ejemplo.