异常映射器适用于我的jersey / spring应用程序中的某些情况,但不适用于其他情况

时间:2017-10-15 08:27:46

标签: java spring jersey

我已经在我的泽西/弹簧应用程序的一部分中使用异常映射器,但由于某些原因它在其他部分不起作用,我不明白为什么,因为它以相同的方式实现。

我希望在抛出UserNameIsNotUnique时抛出我自己的DataIntegrityViolationException异常,它与异常映射器一起映射并返回一个http响应。

我已经使用类似的代码在我的程序的其他部分工作了,但由于某种原因,这个不起作用。我想知道它是否与DataIntegrityViolationException有关。

每当我使用非唯一用户名调用此方法时,都会抛出UsernameIsNotUniqueException,但它似乎没有被映射,我得到404响应,而不是异常中使用的响应映射器。

这就是抛出我想要映射的异常的方法。

public Employee createEmployee(String name, String email, String username, String password, double latvalue, double longvalue, String image, String street, String city, String country) throws ServiceException, UserDoesNotExistException, UserNameIsNotUniqueException, IllegalUserNameException {
    log.info("createEmployee(): email: "+email);
    Employee employee=null;
    try {
        if (userNameIsAReservedWord(username)) {
            throw new IllegalUserNameException("This username is a reserved word: " + username);
        }
        employee = new Employee(name, email, username, latvalue, longvalue, image, street, city, country);
        Employee savedEmployee = employeeRepository.save(employee);
        employeeInfoService.createEmployeeInfo(savedEmployee.getId(), password);
        return savedEmployee;
    } catch (IllegalUserNameException e) {
        log.warn("** SERVICE EXCEPTION ** FOR METHOD: createEmployee()");
        e.printStackTrace();
        throw e;
    } catch (IOException e) {
        log.warn("** SERVICE EXCEPTION ** FOR METHOD: createEmployee()");
        e.printStackTrace();
        throw new ServiceException("** SERVICE EXCEPTION ** FOR METHOD: createEmployee()", e);
    }
    catch(DataIntegrityViolationException e){
        log.warn("** GENERAL EXCEPTION ** FOR METHOD: createEmployee()");
        e.printStackTrace();
        throw new UserNameIsNotUniqueException("A username that is already used was attempted to be created a profile with: "+username);
    }
}

这就是异常映射器类的样子。

@Provider
public class UserNameIsNotUniqueExceptionMapper implements ExceptionMapper<UserNameIsNotUniqueException> {

    @Override
    public Response toResponse(UserNameIsNotUniqueException exception) {
        return Response.status(Response.Status.EXPECTATION_FAILED)
                .entity("Sombody is using this user name already, please select a unique username.").build();
    }

}

这就是Exception的样子。

public class UserNameIsNotUniqueException extends Exception{

public UserNameIsNotUniqueException(String msg, Exception e){
    super(msg, e);
}

public UserNameIsNotUniqueException(String msg){
    super(msg);
}
}

任何帮助,为什么这不起作用将不胜感激。

1 个答案:

答案 0 :(得分:0)

问题是因为我没有使用jersey注册ExceptionMapper类。我用register()方法完成了这个。