Ben JPA için oldukça yeni ve JPA'nın kalıcılık istisnalarını ele alırken en iyi uygulamaları bulmak istiyorum, örneğin adresinin ele alınabileceği benzersiz kısıtlama ihlalleri kullanıcı tarafından. JPA uygulamalarının nasıl yazılacağı konusunda pek çok örnek vardır, ancak istisnaların nasıl elden çıkarılacağı konusunda neredeyse hiçbir şey yoktur. Örneğin:Kullanıcıya anlamlı bir ileti vermek için JPA kalıcılık istisnalarını nasıl ele alıp ayrıştırıyorsunuz?
bir kullanıcının kaydedilmesi /, kişi sistem tarafından aktif zaten kullanımda ve bir kısıtlama ihlali alır email adresini girer: yinelenen bir e-posta eklenir bu hatayı üretir
try {
em.persist(credentials);
} catch (javax.persistence.PersistenceException ex) {
:
WARNING: SQL Error: 0, SQLState: 23505
SEVERE: ERROR: duplicate key value violates unique constraint "EMAIL_UQ_IDX"
Detail: Key (email)=([email protected]) already exists.
Kullanıcıya nasıl anlamlı bir yanıt verebilirim? Mesela şöyle bir şey var: Oops birileri o e-posta adresini kullanıyor gibi görünüyor, daha önce kaydetmediğinize emin misiniz? Bunu ayrıştırmak için bir tesis var mı, yoksa bir istisna mesajına karşı (muhtemelen bir dizi) deyim (ler) ibaresiyle regex çalıştırmam gerekecek mi?
Ve iş katmanında yakalanıp yakalanmayacaksa ... sunum seviyesine tekabül etmek için en iyi yöntemler nelerdir ... daha önce de söylediğim gibi, bu yüzden “güzel” bir mesaj verilebilir. kullanıcı. netlik için
Eklendi: kişi bilesin ki, ben, var ve hala burada kalıcılık istisnalar her çeşit bakıyor ve am araştırmanın bazı ben yapmadım yapıyorum olduğunu' t yukarıda yer "deyimi deneyin" örnekle şunlardır:
try {
em.persist(credentials);
} catch (javax.persistence.PersistenceException ex) {
System.out.println("EXCEPTION CLASS NAME: " + ex.getClass().getName().toString());
System.out.println("THROWABLE CLASS NAME: " + ex.getCause().getClass().getName().toString());
Throwable th = ex.getCause();
System.out.println("THROWABLE INFO: " + th.getCause().toString());
Logger.getLogger(CredentialsControllerImpl.class
.getName()).log(Level.INFO, "Credentials Controller "
+ "persistence exception "
+ "EXCEPTION STRING: {0}", ex.toString());
Logger.getLogger(CredentialsControllerImpl.class
.getName()).log(Level.INFO, "Credentials Controller "
+ "persistence exception "
+ "THROWABLE MESSAGE: {0}", th.getMessage());
Logger.getLogger(CredentialsControllerImpl.class
.getName()).log(Level.INFO, "Credentials Controller "
+ "persistence exceptions "
+ "THROWABLE STRING: {0}", th.toString());
}
:)
içinde
DataAccessException
arasındaDataAccessException
altsınıflar olarak istisnalar @version açıklama bizi olabilir ırk durumunu ortadan kaldırmak için ed? Nasıl çalışır? Düşündüğünüzü kontrol etmeyi düşündüm, ama yarış durumu beni endişelendirdi ve hala öyle. Dediğin gibi, şanslar düşüktür; ama bu sadece nadiren de olsa gerçekleşeceği anlamına geliyor, bu yüzden hala ele alınması gerekiyor. Bunun, özellikle kullanıcı adı ve req'd e-posta adresinin her ikisinin de benzersiz olması gerektiğine izin vermek istiyorsanız, kullanıcının dahil olması gereken nadir kullanım durumlarından biri olduğunu kabul ediyorum. FWIW, yüksek hacimli bir dünyadan geliyorum (DB'lerin/100'lerin Ks'nin 100'leri/sz) bu yüzden gereksiz DB isabetleri konusunda kibirli oluyorum. :) – BillR
Ayrıca, sanırım ki bu iş katmanında sunum katmanına kadar yakalanan kalıcılık istisnasını atacaktı. Böyle bir kullanıcı adresli kısıtlama hatası meydana geldiğinde, yani (nadiren de olsa, bunun gerçekleşeceği anlamına geldiğine inanıyoruz): D). Ya da muhtemelen her durumda ve sunum katmanı kullanıcının ne yapması gerektiğini ve ne kadar sinir bozucu (kullanıcı için) hata sayfası olsa da neyin hoşuna gideceğini sorar. Bu arada giriş için teşekkürler. – BillR
@Version burada herhangi bir amaca hizmet eder: her iki ileti zaten bir e-postanın var olup olmadığını kontrol eder, her ikisi de onu bulamaz ve her ikisi de eklemeye çalışır. Yarış koşulu, sonunda veritabanındaki benzersiz kısıtlama ile çözülecektir. Bu durumda, kullanıcıya genel bir hata iletisi görüntülersiniz veya başarısız olan işlemi otomatik olarak yeniden denersiniz. Yeniden denemenin (özellikle daha önce küçük bir gecikme kullanırsanız) e-postanın olduğunu bulmak için iyi bir şansı vardır ve kullanıcıya anlamlı bir hata mesajı gösterir. –