springboot method handling error custom java spring exception-handling repository

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.