2016-03-21 18 views
0

Kayıt() ve update() - iki işlemi gerçekleştirmek için bir Spring MVC hizmet yöntemim var.Spring MVC özel iletiyle geri alma

Kaydetme() başarıyla yürütüldükten sonra, güncelleştirilecek kullanıcının bulunmadığını bulursam, kaydetme işlemini geri almak için el ile yeni bir RuntimeExceotion() atarım. Bu durumda, tarayıcı mesajına Hata Mesajı ("kullanıcıyı bulamıyor") nasıl iade edebilirim?

@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; 
} 

cevap

0

Neden bir nesne içinde hataları sarın yoktur ve İstisna o geçmesi:

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); 
    } 
} 

Eğer bu kullanabilirsiniz:

CustomException sınıf böyle bir şey görünüyor o.

Daha sonra denetleyici/istek yanıtı işleyicisi katmanında, Hata özel durumunu İstisna'dan alın ve bunu UI katmanına aktarın.

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); 
    } 
} 

istisna Fırlatma sırasında:

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

Kontrolör End bölgesindeki bu durum tut ve verileri içeren ErrorMap ayıklamak. Bu Nesneyi Değiştir/Dönüştür ve UI/Tarayıcı'ya ilet.

+0

Gerçekten minnettarım! Mükemmel çalışıyor, SpringTransactional için bir istisna attıktan sonra bir şey yapmayı düşünmedim. –

0

Sen hata msg içermeyen bir CustomException sınıf ekleyebilir.

Hata mesajlarını müşterinize geri gönderebilirsiniz. Bunun için hangi dönüş türünün olacağına dair servis yapabilirsiniz. Bu yüzden bir Map veya ErrorMessage gönderebilirsiniz. atma sırasında

throw new CustomException("Can not find the user"); 
+0

Yardımlarınız için teşekkürler, belki iyi ifade edemiyorum. Özel Durumu (RuntimeException'ı veya söz konusu CustomException'ı) eklediğimde, Spring MVC bunu devralır ve geri alma işlemini yapar ve "geri dönüşüme"; yürütmeyeceğim. Bir istisna, tarayıcı tarafı (ajax Çağrı) atarsam, Nesne nasıl edinilir? –

+0

Nesnenizi ağ üzerinden göndermek için seri hale getirebilirsiniz. 'public class CustomException genişletir İstisna uygular {@} –

+0

Takip edilen sorunu @Bandi Kishore 'ın tavsiyesiyle çözerim, kontrol yönteminde {service();} catch (CustomException e) {map = e.getErrorMap(); }. SpringTransactional geri alma bittikten sonra try-catch bloğu, bu istisnayı denetleyici yöntemime atar. Sonra hata msg işlemek devam edebilir. –