11

Spring MVC を使用して Web アプリを開発し、永続化のために休止状態にしています。GenericDao に SessionFactory メンバー属性がある私の DAO を考えると:

@Repository
public class Dao extends GenericDao {
    public void save(Object o) {
        getCurrentSession().save(o);
    }
}

そして Service クラス

@Service
public class MyService {
    @Autowired
    Dao dao;

    @Transactional
    public void save(Object o) {
        dao.save(o);
    }
}

永続化例外が発生した場合 (制約、重複など)、ユーザーに通知したいと考えています。私の知る限り、@Transactional注釈は例外が発生してトランザクションマネージャーがロールバックした場合にのみ機能するため、そのメソッドで例外を処理するべきではありません。DAO で発生した例外をどこでどのようにキャッチして、直接または独自の例外にラップしてユーザーに提示できるようにする必要がありますか?

spring のトランザクションサポートを利用したい。

4

2 に答える 2

7

Spring は例外ハンドラーを提供します。

http://static.springsource.org/spring/docs/3.0.x/spring-framework-reference/html/mvc.html#mvc-exceptionhandlers

したがって、ConstraintViolationException を処理するために、コントローラーに次のようなものを含めることができます。

  @ExceptionHandler(ConstraintViolationException.class)
  public ModelAndView handleConstraintViolationException(IOException ex, Command command, HttpServletRequest request) 
{
    return new ModelAndView("ConstraintViolationExceptionView");
}
于 2012-12-07T18:55:18.693 に答える
2

しばらく問題を追跡した後、例外ハンドラー(別の回答で説明されているように)と注釈のrollbackForプロパティを使用してこれを解決しました:@Transactional

@Transactional(rollbackFor = Exception.class)

私の例外ハンドラーは引き続き呼び出され、それに応じて応答を書き込みますが、トランザクションはロールバックされます。

于 2014-09-30T18:51:32.163 に答える