0

好的,对于已经提到的技术,这是一个非常奇怪的行为,我有一个调用服务的控制器,这调用了一个 dao @Column nullable = false, unique = true,当我对 dao 或服务并插入重复的值会引发异常 org.springframework.dao.DataIntegrityViolationException,这没关系,是预期的行为。但是当我运行网络应用程序时,在服务完成后抛出异常,它在执行 dao 时没有执行。所以这迫使我在控制器中捕获异常,而不是在服务中。

  1. 控制器//开始
  2. 服务 //继续
  3. DAO //继续(但此时应该抛出异常)
  4. service // 完成(一个 try catch 围绕着 dao,但没有抛出异常)。
  5. 控制器//抛出异常。

我在每种方法中添加了一些日志,所以我可以看到

插入 ...

服务调用完成后执行语句。

谢谢你。

编辑

这是 xml 事务定义。

<tx:advice id="txAdvice" transaction-manager="transactionManager">
    <tx:attributes>

        <tx:method name="crea*" propagation="REQUIRED"/>
        <tx:method name="obtener*" propagation="SUPPORTS" read-only="true" isolation="DEFAULT"/>
    </tx:attributes>
</tx:advice>

<aop:config>
    <aop:pointcut expression="execution(* com.company.service..*.*(..))"
        id="txPointcut" />
    <aop:advisor advice-ref="txAdvice" pointcut-ref="txPointcut" />
</aop:config>

这是两段代码,第一段是捕获异常。

package com.company.service.tarea.ventas.impl

    public Producto obtenerSiExisteDuplicadaClave(String clave) {

        try{
            return productoService.buscarPorClave(clave);
        }catch(EmptyResultDataAccessException e){
            log.error(e.getMensaje());
        }

        return null;
    }

此代码不起作用

com.company.service.tarea.almacenpt.impl

    public void creaEntradaProduccion(Entrada entrada, BindingResult bindingResult) {
        if(log.isDebugEnabled())log.debug("creaEntradaProduccion");


            entradaService.peristeEntrada(entrada);

        if(log.isDebugEnabled())log.debug("persistido...");
    }

异常被抛出,直到代码执行并将执行返回给控制器,它到达日志“persistido”。

4

2 回答 2

1

这是预期的。持久化实体仅将其与持久化上下文相关联。执行插入语句时将抛出异常,并且在刷新持久性上下文时执行该语句(这会在执行查询之前或提交事务之前自动发生)。

您的测试可能有效,因为测试中的事务是在进行 DAO 调用时启动的,并在之后立即提交。而在生产中,DAO 调用是作为现有事务的一部分进行的,在调用服务时启动,并在服务方法返回时提交。

于 2014-06-04T16:01:51.457 回答
1

@OJVM:您正在捕获特定异常(EmptyResultDataAccessException)。这是逃避 try/catch 块的同一个异常吗?为了识别相同,放置一个通用的异常块。记录下来。一旦确定了逃脱此块的特定异常,请将其添加到此处。

前任:

package com.company.service.tarea.ventas.impl

public Producto obtenerSiExisteDuplicadaClave(String clave) {

    try{
        return productoService.buscarPorClave(clave);
    }catch(EmptyResultDataAccessException e){
        log.error(e.getMensaje());
    }catch(Exception e){
        log.error(e.getMensaje()); // e.getMessage() ; // Once caught put handle this exception also specifically
    }
    return null;
}
于 2020-04-19T08:04:02.390 回答