わかりました、これは既に述べたテクノロジでは非常に奇妙な動作です。サービスを呼び出すコントローラがあり、これが dao を呼び出します。これは@Column nullable = false, unique = true
、dao またはサービスと重複した値が挿入され、例外がスローされますが
org.springframework.dao.DataIntegrityViolationException
、これは正常な動作です。しかし、Webアプリを実行すると、サービスが終了した後に例外がスローされ、daoが実行されているときに実行されません。そのため、サービスではなくコントローラーで例外をキャッチする必要がありました。
- コントローラー //開始
- サービス //継続
- DAO //続行 (ただし、この時点で例外がスローされる必要があります)
- service // 終了します (dao は try catch で囲まれていますが、例外はスローされません)。
- 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」に到達します。