首页 > 解决方案 > 如何在处理 DataIntegrityViolationException 时获取密钥的名称?

问题描述

GenericExceptionHandling在应用程序级别使用

@ControllerAdvice
public class GlobalExceptionHandler {
    
    // Handle the DataIntegrityViolationException
    @ExceptionHandler(DataIntegrityViolationException.class)
    public ResponseEntity<?> customDataIntegrityViolationException
                                (DataIntegrityViolationException exception) {
        String message = "This {key} is already exist";
        ErrorDetails errorDetals = new ErrorDetails(new Date(), message, exception.getCause().getMessage());
        return new ResponseEntity<Object>(errorDetals, HttpStatus.UNPROCESSABLE_ENTITY);
    }
}

我想获取导致错误的键的名称。即{键}。我用谷歌搜索但没有得到任何解决我问题的答案。如果有人做过这种工作,请提出一种方法。

标签: javaspringspring-boothibernatespring-mvc

解决方案


我想您应该搜索异常消息,例如

      try{
            userRepository.save(user);
        }
        catch (DataIntegrityViolationException ex){

            if(ex.getMessage().contains("unique_username")){
                throw new DataIntegrityViolationException("The username: "+user.getUsername()+" is duplicated");
            }
            else if(ex.getMessage().contains("unique_email")){
                throw new DataIntegrityViolationException("The email: "+user.getEmail()+" is duplicated");
            }

            else {
                throw new DataIntegrityViolationException(ex.getMessage());
            }

        }

为了更好地搜索约束,您可以指定约束名称,例如

@Entity
@Table(name = "user_tbl",
uniqueConstraints = {@UniqueConstraint(columnNames ="username", name = "unique_username"),
               
                    @UniqueConstraint(columnNames ="email", name = "unique_email")})


public class User {

    String username;
    String email;
    .
    .
    .
    
}

推荐阅读