如何在Spring Controller中处理数据库特定的异常

时间:2019-05-06 14:46:31

标签: java spring model-view-controller

在我的控制器中 我调用了多种数据库方法。 这些行需要存储在oracle和postgres中。 在这种情况下,我应该如何处理异常; 重复项,违反唯一约束的异常等。

在代码中, 我处理与oracle和postgres相关的异常。 此代码均为重复代码。 如何使用通用代码处理这种情况。

在这种情况下,处理异常的好方法是什么。

catch (Exception e) {
    if (e instanceof PSQLException || (e.getCause() != null && e.getCause().getMessage().contains("already exists"))) {
        String errMsg = e.getCause().getMessage();
        if (errMsg.contains("already exists")) {
            errMsg = errMsg.substring(errMsg.indexOf('"') + 1, errMsg.lastIndexOf('"'));
        }
        userResponse.setMessage("ExistedUser");
        userResponse.setValue(errMsg);
    } else if (e instanceof SQLIntegrityConstraintViolationException || e.getLocalizedMessage().contains("SQLIntegrityConstraintViolationException")) {
        userResponse.setMessage("Duplicate");
    }
}

2 个答案:

答案 0 :(得分:1)

看看callback design pattern。基本上,您在代码中使用接口的实例,并且接口的实现处理您的异常/数据库事务。您可能会有类似的内容:

public interface DatabaseQuery {
    public void execute();
}

public class OracleQuery implements DatabaseQuery {

@Override
public void execute() {
   //run query, catch exceptions etc.

}

}

public class PostgresQuery implements DatabaseQuery {

@Override
public void execute() {
   //run query, catch exceptions etc.

}

}

然后在您需要执行数据库事务的代码中,传入此接口的实例:

public class TestQuery {
    DatabaseQuery query;

    public TestQuery(DatabaseQuery query) {
          this.query = query;
    }

    public void SomeDatabaseStuff() {
        //some code
        // need to work with the db
        query.execute();
        //some more code
    }
}

您不必担心它的Oracle还是Postgres,该实现将在后台进行处理。

答案 1 :(得分:0)

在控制器方法中,只要注册了异常处理程序即可正确处理它们,就可以允许异常冒泡,这只是spring为您提供的几种处理异常的方法之一,请参见https://spring.io/blog/2013/11/01/exception-handling-in-spring-mvc更全面的例子