我正在学习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 ...;
    }
}

08-05 22:32