【问题标题】:Handling managed Hibernate DAO exceptions in Dropwizard在 Dropwizard 中处理托管的 Hibernate DAO 异常
【发布时间】:2015-05-24 23:25:15
【问题描述】:

我在使用 Dropwizard 时遇到问题,我无法在我的资源中捕获 Hibernate DAO 对象引发的异常。

我有以下 DAO 对象

public class ApplicantDAO extends AbstractDAO<Applicant>
{
    public ApplicantDAO(SessionFactory factory)
    {
        super(factory);
    }

    public long create(Applicant person)
    {
        return persist(person).getApplicantId();
    }
}

我从我的 Dropwizard 资源中调用 create 方法,我从我的应用程序的 run 方法将我的托管 DAO 传递到该资源。以下不起作用:

try
{
    long id = dao.create(applicant);
    message += "[Stored: " + id + "] ";
}catch (HibernateException ex)
{
    message +="Could't store: " + exptionToString(ex);
}

相反,我收到了 Dropwizard/Jersey 的消息:

{"code":500,"message":"There was an error processing your request. It has been logged (ID a785167e05024c69)."}

有没有办法解决这个问题?

【问题讨论】:

    标签: java hibernate jersey dropwizard


    【解决方案1】:

    我不熟悉 Drop Wizard。

    但我最好的客人是它注册了一个 JAX-RS ExcepionMapper,当抛出异常时会写入自己的错误

    请参阅:javax.ws.rs.ext.ExceptionMapper

    【讨论】:

    • 谢谢,我认为你是对的。有没有办法让异常在我的代码中处理?
    • 也许如果你注册自己的映射器,它处理一个非常具体的异常,注册一个具有更高优先级的异常映射器
    • 查看@Priority 注释,不确定它是否适用于异常映射器......值得一试
    • 其他建议:您可以抛出一个 WebApplicationException,响应为非空(因为据我所知,它们没有被异常映射器捕获)......类似于 throw new WebApplicationException(response)
    • 谢谢。如果我将 Try/Catch 放在“create”方法中,则永远不会捕获到异常。
    【解决方案2】:

    我想通了。问题是由于事务内部抛出异常而发生的。

    所以我没有在我的资源方法上添加@UnitOfWork,而是添加了@UnitOfWork(transactional = false)

    然后我可以通过将 SessionFactory 传递给我的资源来管理我自己的事务,这就成功了!

    可能与以下问题有关:https://github.com/dropwizard/dropwizard/issues/949

    【讨论】:

      猜你喜欢
      • 2014-10-18
      • 2014-07-09
      • 1970-01-01
      • 2011-11-04
      • 2011-02-20
      • 2019-12-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多