gpt4 book ai didi

java - MyBatis 映射器直接注入(inject)到服务类中。异常(exception)情况呢?

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:03:32 25 4
gpt4 key购买 nike

我目前正在使用 MyBatis-Spring 集成框架,这是我从文档中读到的内容:

Rather than code data access objects (DAOs) manually using SqlSessionDaoSupport or SqlSessionTemplate, Mybatis-Spring provides a proxy factory: MapperFactoryBean. This class lets you inject data mapper interfaces directly into your service beans. When using mappers you simply call them as you have always called your DAOs, but you won't need to code any DAO implementation because MyBatis-Spring will create a proxy for you.

这是一个非常好的特性……但是异常处理呢?我应该在哪里翻译 SQL 错误?在我的服务层?但它不会违反服务 DAO 模式吗?

例子:

public final class AccountServiceImpl implements AccountService {
(...)
private AccountMapper accountMapper;
(...)
@Override
public void addAccount(Account account) throws AccountServiceException {

//Validating, processing, setting timestamps etc.
(...)

//Persistence:
int rowsAffected;
try {
rowsAffected = accountMapper.insertAccount(account);
} catch (Exception e) {
String msg = e.getMessage();
if (msg.contains("accounts_pkey"))
throw new AccountServiceException("Username already exists!");
if (msg.contains("accounts_email_key"))
throw new AccountServiceException("E-mail already exists!");
throw new AccountServiceException(APP_ERROR);
}

LOG.debug("Rows affected: '{}'", rowsAffected);

if (rowsAffected != 1)
throw new AccountServiceException(APP_ERROR);
}

在服务层翻译异常可以吗?

应该怎么做?

提前感谢您的建议。

最佳答案

最近在一个项目中使用了 mybatis-spring,我遇到了同样的绊脚石。我也不想在我的服务类中乱扔 DAO 异常处理,特别是因为我的服务层中的某些方法需要对许多不同的表进行只读访问。

我得出的解决方案是在服务层捕获异常,但创建您自己的异常类型,将捕获的异常作为参数。这样就可以在实际构造异常时过滤出应该包含什么样的错误消息,并且不需要字符串匹配(至少在服务层)。

除了 AccountServiceException 会有一个将 Exception e 作为参数的构造函数外,您已经很接近了。我还选择尽早尝试并完成所有数据访问,并将其全部包装在一个 try/catch 中。由于 MapperFactoryBean 总是将抛出的异常转换为 Spring DataAccessExceptions,因此您不必担心在进行数据访问时捕获其他类型的异常。

我犹豫是否将此视为答案 - 更多的是分享经验,因为我遇到过这个问题并且也犹豫过。

关于java - MyBatis 映射器直接注入(inject)到服务类中。异常(exception)情况呢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8728475/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com