Exception Handling در Play framework در زمان استفاده از JPA

+1 رأی

چطور می توان در play framework، زمانی که از JPA.withTransaction استفاده می کنیم و در زمان Insert به خطاهایی مانند UniqueConstraintViolation برمی خوریم، این خطا را هندل کنیم؟ چون JPA تمام این خطاهارو به RunTimeException می اندازد...

سوال 1 سال قبل در تالار کامپیوتر و اینترنت توسط mors (15 امتیاز) 0% درصد پذیرش
ویرایش 1 سال قبل توسط Saeed Zarinfam
چرا از متد JPA.withTransaction استفاده می کنید؟ این متد بیشتر برای تست کاربرد داره.
خب اگه منظورتون استفاده از @Transaction هست که بازم مشکل رو حل نمی کنه. موضوع گرفتن Exception هایی از این دست هست که در ارتباط با دیتابیس بهش برمی خوریم ولی نمیشه Catch کرد. فکر کنید کاربر بخواهد در یک سامانه شماره موبایل تکراری وارد کند و این فیلد در دیتابیش Unique باشد. چطور پیغام اینکه این شماره تکراری است را می توان پس از اینکه در Exception موردنظر افتاد هندل می کنید؟

1 جواب

0 رأی

از Play 2.4 استراتژی تیم Play این شده که global state ها مثل همین کلاس JPA از Play حذف بشه و همه چی بر مبنای Dependency Injection جلو بره. global state ها بیشتر کار راه اندازن و برای مواردی که شما می خواهید توضیه می کنیم اگر از Play 2.3 استفاده می کنید، پروژه خود را با Spring یا Guice ستاپ کنید و اگر از Play 2.4 استفاده می کنید از JPAApi استفاده کنید تا کنترل کاملتری بر روی معماری و کامپوننت های پزوژه خود داشته باشید.

برای مثال شما برای تشخیص خطای UniqueConstraintViolation باید یک try catch برای متد persist بگذارید و خطای PersistenceException را catch کنید و بصورت زیر آن را پردازش کنید:

        Task task = new Task();
        task.setTaskTitle("test task");

        try {
            JPA.em().persist(task);
        }catch (PersistenceException e){
            System.out.println("----"+e.getCause().getCause().getMessage());
        }
جواب 1 سال قبل توسط Saeed Zarinfam (66 امتیاز)
ویرایش 1 سال قبل توسط Saeed Zarinfam
من از play2.4 استفاده می کنم. متاسفانه جوابم رو نگرفتم.
JPAApi به شما EntityManager می دهد و شما می تونید ادامه داستان رو مثل سابق جلو ببرید مشکل کجاست؟
یا  اینکه EntityManager رو بدین به Spring و با Spring Transaction به مدیریت Transaction بپردازید.
شما این خط کد را در نظر بگیرید در متدی با @Transaction :
JPA.em().persist(user);
خب اگر منظور شما از JPAAPI این باشه و در ضمن فیلد موبایل برای unique، user باشه باید خطای UniqueConstraintViolation بده ولی توی RunTimeException می افته. سوال من اینجاست که چطور میشه UniqueConstraintViolation رو Catch کردو پیغام مرتبط داد؟
جواب ویرایش شد.
متاسفانه تکه کدی که شما نوشتید در صورتیکه آبجکت Task فیلد unique داشته باشد و انتظار ConstraintViolationException داشته باشید هیچ وقت در Catch نمی افته و این دقیقا سوال منه که چرا؟
من همین کد رو تست کردم و تو catch میوفته.
حالا اگه کسی بخواد دو تا instance  از EntityManager داشته باشه باید چی کار کنه
JPA.em() به نظر میرسه Singleton باشه
نمیدونم آینده زبانهایی مثل اسکالا چیه ولی خیلی خوبه که فریم  ورکهایی مثل Akka با این زبانها پدید اومده
نکته اول: خود JPA.em یه پارامتر String میگیره که نام DataSource هست و EntityManager مربوط به اون DataSource رو بر می گردونه.
نکته دوم: میشه کلا به راحتی بجث JPA و ارتباط به دیتابیس تو Play رو سپرد دست Spring و طبق استاندارد های repository های Spring کد زد.
نکته سوم: تمام مباحث مطرح شده در این سوال درباره جاوا نه اسکالا !!! اسکالا از JPA استفاده نمی کنه و لایبرری با نام Slick داره که FRM که اصلا تو دنیای جاوا وجود نداره.
پس برمیگرده به فریم ورک Play اصولا از نظر معماری بهتره تا حد ممکن از یک فریم ورک برای IoC و Bean Management استفاده کرد نمیدونم Play تا چه حد این رو مدیریت میکنه یا اصلا موقعیکه در جاوا ازش استفاده میکنیم باید خود Play رو با Spring مدیدیریت کنیم.
نکته دوم در دنیای واقعی پیش میاد حداقل برای Grails به عینه دیدم Scalaرو نمیدونم که تیمی برای صرفه جویی در وقت از کتابخانه ای که توسط تیم دیگری مثلا با JPA نوشته شده مجبور شده استفاده کنه خوب اگه در Scala به همچین کیسی میش بیاد دیگه با توجه به مدیریت پروژه معمار تیم اجازه نمیده او منطق کاری دوباره  با تکنولوژی مثل Slick نوشته بشه یعنی در اسکالا مجبوری از JPA استفاده کنی
سوالم اینجاست که البته بهتره یه این رو در قالب سوال در جواب یاب بگم و این بحث رو اونجا منتقل کنیم
چطور در اسکالا با استفاده از Play میتوان از JPA استفاده کرد؟
سوال دوم چطور میتوان EntityManager رو در Play بدون وابسته شدن به فریم دیگری مثل Spring مدیریت کرد؟
هر دو مورد که گفتید به راحتی امکان پذیره و روش کار شده. منم موافقم در قالب سوال در جواب یاب مطرح بشه که بقیه هم روش بحث کنن.

سوال های مشابه

0 رأی
0 جواب 27 بازدید
0 رأی
1 جواب 43 بازدید
سوال 1 سال قبل در تالار کامپیوتر و اینترنت توسط ehsolimo (292 امتیاز)
+1 رأی
1 جواب 42 بازدید
...