سؤال

أنا أعمل مع Spring MVC وأرغب في ربط كائن AA المستمر من قاعدة البيانات ، لكن لا يمكنني معرفة كيف يمكنني تعيين الكود الخاص بي لإجراء مكالمة إلى DB قبل الربط. على سبيل المثال ، أحاول تحديث كائن "BenefitType" إلى قاعدة البيانات ، ومع ذلك ، أريد أن يحصل على الكائن من قاعدة البيانات ، وليس إنشاء واحد جديد لذلك لا يتعين علي تحديث جميع الحقول.

    @RequestMapping("/save")
public String save(@ModelAttribute("item") BenefitType benefitType, BindingResult result)
{
    ...check for errors
    ...save, etc.
}
هل كانت مفيدة؟

المحلول 2

لذلك انتهى بي الأمر بحل هذا عن طريق التعليق على طريقة باستخدام modelattribute بنفس الاسم في الفصل. يقوم Spring ببناء النموذج أولاً قبل تنفيذ تعيين الطلب:

@ModelAttribute("item")
BenefitType getBenefitType(@RequestParam("id") String id) {
    // return benefit type
}

نصائح أخرى

هناك العديد من الخيارات:

  • في أبسط حالة عندما يكون للكائن الخاص بك خصائص بسيطة فقط ، يمكنك ربط جميع خصائصه بحقول النموذج (hidden إذا لزم الأمر) ، واحصل على كائن ملزم بالكامل بعد إرسال. يمكن أيضًا ربط الخصائص المعقدة بحقول النموذج باستخدام PropertyEditorس.

  • يمكنك أيضًا استخدام جلسة لتخزين الأشياء بين GET و POST الطلبات. ربيع 3 يسهل هذا النهج مع @SessionAttributes التعليق التوضيحي (من عينة petclinic):

    @Controller
    @RequestMapping("/owners/*/pets/{petId}/edit")
    @SessionAttributes("pet") // Specify attributes to be stored in the session       
    public class EditPetForm {    
        ...
        @InitBinder
        public void setAllowedFields(WebDataBinder dataBinder) {
            // Disallow binding of sensitive fields - user can't override 
            // values from the session
            dataBinder.setDisallowedFields("id");
        }
        @RequestMapping(method = RequestMethod.GET)
        public String setupForm(@PathVariable("petId") int petId, Model model) {
            Pet pet = this.clinic.loadPet(petId);
            model.addAttribute("pet", pet); // Put attribute into session
            return "pets/form";
        }
        @RequestMapping(method = { RequestMethod.PUT, RequestMethod.POST })
        public String processSubmit(@ModelAttribute("pet") Pet pet, 
            BindingResult result, SessionStatus status) {
            new PetValidator().validate(pet, result);
            if (result.hasErrors()) {
                return "pets/form";
            } else {
                this.clinic.storePet(pet);
                // Clean the session attribute after successful submit
                status.setComplete();
                return "redirect:/owners/" + pet.getOwner().getId();
            }
        }
    }
    

    ومع ذلك ، قد يسبب هذا النهج مشاكل إذا كانت هناك عدة حالات من النموذج مفتوحة في وقت واحد في نفس الجلسة.

  • لذلك ، فإن النهج الأكثر موثوقية للحالات المعقدة هو إنشاء كائن منفصل لتخزين حقول النماذج ودمج التغييرات من هذا الكائن إلى كائن ثابت يدويًا.

على الرغم من أنه من الممكن أن يكون نموذج المجال الخاص بك بسيطًا للغاية بحيث يمكنك ربط كائنات واجهة المستخدم مباشرة بكائنات نموذج البيانات ، فمن الأرجح أن هذا ليس كذلك ، وفي هذه الحالة أوصي بشدة بتصميم فئة خصيصًا لربط النماذج ، ثم ترجمة بينه وبين كائنات المجال في وحدة التحكم الخاصة بك.

أنا مرتبك قليلاً. أعتقد أنك تتحدث بالفعل عن سير عمل تحديث؟

تحتاج إلى اثنين من requestmappings ، واحد للحصول على GET وواحد للنشر:

@RequestMapping(value="/update/{id}", method=RequestMethod.GET)
public String getSave(ModelMap model, @PathVariable Long id)
{
    model.putAttribute("item", benefitDao.findById(id));
    return "view";
}

ثم في المنشور تحديث الحقل فعليًا.

في مثالك أعلاه ، يجب أن يتم ملء modelattribute بالفعل بطريقة مثل الطريقة أعلاه ، ويتم ربط الخصائص باستخدام شيء مثل JSTL أو Spring tabglibs بالتزامن مع كائن دعم النموذج.

قد ترغب أيضًا في النظر إلى initbinder اعتمادا على حالة الاستخدام الخاصة بك.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top