0

わかりました、これは既に述べたテクノロジでは非常に奇妙な動作です。サービスを呼び出すコントローラがあり、これが dao を呼び出します。これは@Column nullable = false, unique = true、dao またはサービスと重複した値が挿入され、例外がスローされますが org.springframework.dao.DataIntegrityViolationException、これは正常な動作です。しかし、Webアプリを実行すると、サービスが終了した後に例外がスローされ、daoが実行されているときに実行されません。そのため、サービスではなくコントローラーで例外をキャッチする必要がありました。

  1. コントローラー //開始
  2. サービス //継続
  3. DAO //続行 (ただし、この時点で例外がスローされる必要があります)
  4. service // 終了します (dao は try catch で囲まれていますが、例外はスローされません)。
  5. controller //例外がスローされます。

各メソッドにいくつかのログを追加したので、

に挿入します...

サービスコールが終了すると文が実行されます。

ありがとうございました。

編集

これは 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>

これは 2 つのコード スニペットです。1 つ目は例外をキャッチしています。

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

それは予想されます。エンティティを永続化すると、永続化コンテキストに関連付けられるだけです。insert ステートメントが実行されると例外がスローされ、永続コンテキストがフラッシュされるとステートメントが実行されます (これは、クエリが実行される前、またはトランザクションがコミットされる前に自動的に行われます)。

テストのトランザクションは、DAO 呼び出しが行われたときに開始され、直後にコミットされるため、テストはおそらく機能します。一方、本番環境では、DAO 呼び出しは既存のトランザクションの一部として行われ、サービスが呼び出されたときに開始され、サービス メソッドが返されたときにコミットされます。

于 2014-06-04T16:01:51.457 に答える