java - 如何在处理 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);
}
}
我想获取导致错误的键的名称。即{键}。我用谷歌搜索但没有得到任何解决我问题的答案。如果有人做过这种工作,请提出一种方法。
解决方案
我想您应该搜索异常消息,例如
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;
.
.
.
}
推荐阅读
- javascript - 如何使用javascript循环对象数组?
- javascript - 将 svg 转换为 react-native-svg
- sql-server - 什么是重复相同数字 5 次或更多次的正则表达式,例如 11111、22222、33333、44444
- javascript - 折射:从猫鼬回调中返回或推送值到新的数组值
- sonarqube - sonar-runner.bat JAVA_HOME 未指向有效的 Java 主目录
- python - jupyter notebook 没有在 anaconda 提示符中打开
- ruby-on-rails - 在三元运算符条件下带有 Link_to 助手的 Image_tag
- c++ - 重载运算符<<在谷歌C++风格
- sails.js - Sails.js 1.0 find 不会自动返回关联
- javascript - 通过服务器路径访问 json 对象时获取 xmlhttp 响应为空