我正在学习Jersey / JAX-RS,并且在ExceptionMapper方面需要一些帮助。
我有一个UserFacade类,AbstractFacade类和User类本身,它们都是非常标准的,主要是通过使用Netbeans中的Database创建一个新的Web Service RestFUL项目而生成的。我的问题是,我现在想开始捕获错误,例如说“ Unique Constraint Violation”错误。我以为我需要实现一个异常映射器...我的外观中包含以下内容:
@提供者
公共类EntityNotFoundMapper实现ExceptionMapper {
@Override
public javax.ws.rs.core.Response toResponse(PersistenceException ex){
返回Response.status(404).entity(ex.getMessage())。type(“ text / plain”)。build();
}
}
这是我得到的错误,我的自定义异常处理程序未捕获该错误。
警告:StandardWrapperValve [service.ApplicationConfig]:Servlet服务的Servlet.service()抛出异常
com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException:键'username'的条目'usernamegoeshere'重复
我觉得我已经接近了,我没有尝试从上面的示例中捕获MySQLIntegrityConstraintViolationException的唯一原因是,因为我只是试图首先捕获所有可能的错误(以确保其正常工作),所以我将缩小范围并在看到语法有效后再进行具体说明。
我究竟做错了什么?
最佳答案
始终参数化ExceptionMapper
:
public class EntityNotFoundMapper
implements ExceptionMapper<PersistenceException> { ... }
MySQLIntegrityConstraintViolationException似乎没有扩展PersistenceException。要捕获
MySQLIntegrityConstraintViolationException
,您需要直接为该类或其前任之一创建一个ExceptionMapper
,例如:@Provider
public class MySqlIntegrityMapper
implements ExceptionMapper<MySQLIntegrityConstraintViolationException> {
@Override
public Response toResponse(MySQLIntegrityConstraintViolationException ex) {
return ...;
}
}
或更通用的SQLException(因为
MySQLIntegrityConstraintViolationException
继承自它):@Provider
public class SqlExceptionMapper implements ExceptionMapper<SQLException> {
@Override
public Response toResponse(SQLException ex) {
return ...;
}
}