SpringBoot—如何在java中使用自定义值引发自定义异常?

a11xaf1n  于 2021-07-06  发布在  Java
关注(0)|答案(1)|浏览(410)

大家好,我正在使用mysql的SpringBoot。我在查找信息时出现以下错误,
javax.persistence.ununiqueresultexception:查询未返回唯一结果:2
在我的repository类中,我有以下代码,
可选findbyidoremail(整数id,字符串电子邮件);
我认为错误是因为 findByIdOrEmail 正在获取多条记录,因为 OR 接线员。
所以我用了一个 List 下面是我的代码,我的目标是抛出一个异常,该异常专门显示每个重复的值。

List<User> userList = userRepo.findByIdOrEmail(user.getId(), user.getEmail());

// There will be maximum of 2 records fetched by id and email and I didn't 
check if each result is the users record
if (!userList.isEmpty() && userList.size() > 1)
    throw new CustomException("Duplicate Record Found" +
            " id: " + user.getId() + " and email: " + user.getEmail());
else if (!userList.isEmpty())
    throw new CustomException("Duplicate Record Found" +
            (userList.get(0).getId().equals(user.getId()) ? "id: " + user.getId() : "email: " + user.getEmail()));

所以我想知道这种方法是最好的还是有其他的最佳实践?因为用户应该能够更新他/她的记录,但检查与现有其他记录的重复。因为它有时会给出一个值列表,所以我必须在循环中检查它们。这是我在上面的代码中没有做过的。那么,有没有其他最好的方法或简单的方法来做到这一点,而不循环和多个if条件?非常感谢您的回答。提前谢谢。

y1aodyip

y1aodyip1#

让我们创建一个自定义ResourceReadyExistsException类。它将扩展runtimeexception类,您可以向其中添加任意多的参数。我一直这么简洁。

public class ResourceAlreadyExistsException extends RuntimeException {

    public ResourceAlreadyExistsException(String property, String value) {
        super(String.format(
            "Resource with property %s and value %s already exists." +
            "Make sure to insert a unique value for %s",
            property, value, property));
    }
}

每当我需要检查一个唯一的资源时,我可以告诉用户哪个特定的属性有什么值导致了错误。此外,我还通知用户必须采取什么措施来避免错误。
比方说,我选择使用error***作为我的resourceAreadyExistsException。不过,我还是需要将此错误消息连接到exceptionresponsehandler。额外的方法与我们通常创建的处理所有异常的方法非常相似。事实上,您可以轻松地为所有异常复制粘贴此方法。您所要做的就是将exception类更改为您的exception并更改httpstatus。 .

@ExceptionHandler(ResourceAlreadyExistsException.class)
public final ResponseEntity<ExceptionResponse> handleResourceAlreadyExistsException(
    ResourceAlreadyExistsException ex, WebRequest req) {
    ExceptionResponse exceptionResponse = new ExceptionResponse(
        new Date(),
        ex.getMessage(),
        req.getDescription(false)
    );
    return new ResponseEntity<>(exceptionResponse, HttpStatus.UNPROCESSABLE_ENTITY);

相关问题