【问题标题】:Distinquish between jpa DataIntegration exception区分 jpa DataIntegration 异常
【发布时间】:2018-11-11 12:53:51
【问题描述】:

我有一个实体

@Entity
class Person{
    @Id
    @GeneratedValue
    private long id;

    @Column(nullable = false, length = 10)
    private String name;
}

现在当 name 为 null 或长度大于 10 时,JPA 会抛出 DataIntegrityViolationException

有什么方法可以区分吗?

我有 ADviceController

@ControllerAdvice
public class ExceptionHandlers {
    @ExceptionHandler(value =  DataIntegrityViolationException.class)
    public ResponseEntity<ErrorsMessage> handleViolation(DataIntegrityViolationException e ){
      return new ResponseEntity(ErrorMessage(value),HttpStatus.BAD_REQUEST)
    }
}

我想要做的是设置value的ErrorMessage对象,当名称为null时返回“null参数”,如果名称大于10,则将值设置为long parameter

有什么方法可以区分吗?

感谢您的帮助!

【问题讨论】:

  • 不太确定,但您可以尝试通过messagecause。两者都包含一些信息,但我不知道确切的信息是什么以及是否确实不同。
  • 这不是 JPA 异常,而是 SPRING 异常。

标签: java spring jpa exception


【解决方案1】:

有关违反约束的信息包含在异常本身中,可以通过获取most specific casue 及其消息来提取:

@ExceptionHandler(value =  DataIntegrityViolationException.class)
public ResponseEntity<ErrorsMessage> handleViolation(DataIntegrityViolationException e ){
    String message = e.getMostSpecificCause().getMessage();
    // ...
}

编辑:在方法的主体中,您可以对提取的消息执行操作并返回响应或重新抛出您的自定义异常。

【讨论】:

  • 是的,但这就是 JPA 抛出的错误消息,我想返回自定义消息,我不想为此创建 if statemenet hell ,+ 如果我想添加违反完整性的列怎么办 +自定义消息?
  • @Johnyb 如果您已经区分了错误,那么您可以使用自定义消息抛出您自己的异常
  • @XtremeBaumer 是的,但我必须像 if(e.getMostSpecificCause().getMessage().match("null"){...} 那样做,否则我不会?
  • @Johnyb 完全正确。没有办法解决它,因为它们对两种情况都使用相同的异常类
  • @XtremeBaumer:同意并感谢 - 我已经编辑了答案。
猜你喜欢
  • 2019-02-21
  • 2012-02-21
  • 1970-01-01
  • 2018-08-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-11
  • 2011-04-21
相关资源
最近更新 更多