2016-03-21 11 views
0

save()とupdate() - 2つの操作を実行するSpring MVCサービスメソッドがあります。カスタムメッセージでのSpring MVCロールバック

save()が正常に実行された後、更新するユーザーが存在しない場合は、手動で新しいRuntimeExceotion()をスローして保存操作をロールバックします。この場合、エラーメッセージ(「ユーザーを見つけることができません」)をブラウザ側に返すにはどうすればよいですか?

@Transactional(rollbackFor = { Exception.class }) 
public Map<String,Object> service(){ 
    Map<String,Object> map = new HashMap<String,Object>(); 
    //1. save user 
    User user = getUser(); 
    this.save(user); 

    //2. try to update another 
    String anotherUserId = "anUserId"; 
    User anUser = this.getById(anotherUserId); 
    if(anUser != null){ 
     anUser.setName("newName"); 
     this.update(anUser); 
     map.put("status",true); 
    }else{ 
     //logical error 
     map.put("status",false); 
     map.put("err_msg","cant find the user for update");   

     //triger rollback(rollback save user) 
     throw new RuntimeException("update user error"); 
    } 
    return map; 
} 

答えて

0

:あなたがすることで、これを使用することができます

public class CustomException extends Exception implements Serializable { 

    public CustomException(String errorMsg) 
    { 
     super(errorMsg); 
    } 
    public CustomException(Throwable cause){ 
     super(cause); 
    } 

    public CustomException(String message ,Throwable cause){ 
     super(message,cause); 
    } 
} 

CustomExceptionクラスは、そのような何かに見えますそれ。

後でコントローラ/リクエストレスポンスハンドラレイヤで、例外からErrorオブジェクトを取得し、それをUIレイヤに渡します。

Class CustomException extends Exception { 

    Map<String,Object> errorMap; 

    public CustomException(String errorMsg, Map errorMap) 
    { 
     super(errorMsg); 
     this.errorMap = errorMap; 
    } 
    public CustomException(Throwable cause){ 
     super(cause); 
    } 

    public CustomException(String message ,Throwable cause){ 
     super(message,cause); 
    } 
} 

例外をスローしながら:

throw new CustomException("Can not find the user", map); 

をコントローラーエンドでは、この例外をキャッチし、あなたのデータが含まれているErrorMapを抽出します。 このオブジェクトをラップ/変換し、UI /ブラウザに渡します。

+0

本当に感謝しています!それは完璧に動作します、私はSpringTransactionalへの例外を投げた後に何かをすることについて考えませんでした。 –

0

エラーメッセージが含まれているCustomExceptionクラスを追加できます。

クライアントにエラーmsgを返すことができます。そのためには、型を返すサービスをObjectにすると、MapまたはErrorMessageを送信することができます。

あなたがオブジェクトであなたのエラーをラップして投げながら例外にそれを渡さないのはなぜ
throw new CustomException("Can not find the user"); 
+0

ご協力いただきありがとうございます。多分私はうまく表現できません。 Exception(RuntimeExceptionや、あなたの言ったCustomExceptionのような)をスローすると、Spring MVCがこれを継承してロールバック操作を行い、私の "return obj;"実行されることはありません。 私は例外、ブラウザ側(ajax呼び出し)、オブジェクトを取得する方法をスローする場合は? –

+0

オブジェクトをシリアル化してネットワーク経由で送信することができます。 'public class CustomExceptionは例外を実装していますSerializable {}' –

+0

コントローラーメソッドで@Bandi Kishoreのアドバイスに従って問題を解決します。{service();} catch(CustomException e){map = e.getErrorMap(); }。 try-catchブロックによって、SpringTransactionalロールバックが終了した後、この例外がコントローラメソッドにスローされます。それから私はエラーmsgハンドルを続けることができます。 –

関連する問題