سؤال

الاعتذار إذا تم طرح هذا السؤال من قبل. آمل أن يتمكن شخص ما من التدخل ومساعدتي في معرفة سبب عدم ظهور أخطاء التحقق من صحة النموذج.

أنا أستخدم Spring 3.0.3 و Hibernate ، وأنا أستخدم التحقق من صحة JSR-303 للتحقق من صحة مدخلات النموذج الخاصة بي. لديّ وحدة تحكم زنبركية تتعامل مع الحصول على صفحة تحتوي على نموذج تم إنشاؤه بمساعدة نموذج الربيع. في هذا النموذج ، يمكن للمستخدم تغيير اسمه وحفظه في قاعدة البيانات. إذا كان أي من الإدخال فارغًا ، فيجب عرض الصفحة التي تحتوي على النموذج مرة أخرى مع رسائل الخطأ. يعالج وحدة التحكم نفسها تقديم الصفحة. يبدو أن وحدة التحكم تعمل بشكل صحيح في معظم النواحي ، ولكن عندما يكون هناك خطأ في نموذج إرسال المستخدم ، لا توجد أخطاء تظهر على الصفحة.

هذا هو شكل الشكل:

<form:form commandName="changeNameCommand">
    <form:errors path="*" cssClass="errorBox" />

    <table width="100%" border="0" cellspacing="5" cellpadding="5" align="left">
      <tr>
    <td><b>First Name:</b></td>
    <td><form:input path="firstName" value="${user.firstName}" /></td>
  </tr>
  <tr>
    <td><b>Last Name:</b></td>
    <td> <form:input path="lastName" value="${user.lastName}" /></td>
  </tr>
</table>
</form:form>    

لاحظ أن هناك كائن مستخدم في العرض الذي يتم استخدامه لملء النموذج مع الاسم الحالي والمستخدم للمستخدم. هذا يعمل بشكل صحيح.

تبدو وحدة التحكم شيئًا من هذا القبيل:

@Controller
@RequestMapping(value =  "/account/settings/change-name")
@SessionAttributes("changeNameCommand")
public class ChangeNameController {

    @ModelAttribute("changeNameCommand")
    public ChangeNameCommand getCommand() {
        return new ChangeNameCommand();
    }

    @RequestMapping(method = RequestMethod.GET)
    public ModelAndView getChangeNamePage(HttpServletRequest req) {
    ModelAndView mav = new ModelAndView("Account.ChangeName");
        mav.addObject("page_title", "Change Name");

        return mav;
    }

    @RequestMapping(method = RequestMethod.POST)
    public String doChangeName(
                @ModelAttribute("changeNameCommand") 
                    @Valid ChangeNameCommand command, 
                    BindingResult result, SessionStatus status) {

        if (result.hasErrors()) {
            return "redirect:/account/settings/change-name"; 
        }

    // Code here to persist updated user first and last name to database...        

        status.setComplete();

        return "redirect:/home";
    }
}

أنا استخدم البلاط 2.1.2 لتكوين صفحات و urlrewrite 3.1.0 للمساعدة في تكوين عناوين URL ودية.

تبدو فئة ChangenAmecommand مثل هذا:

import org.hibernate.validator.constraints.NotEmpty;

public class ChangeNameCommand {

    @NotEmpty(message = "You must provide a first name.")
    private String firstName;

    @NotEmpty(message = "You must provide a last name.")
    private String lastName;

    @NotEmpty(message = "Your password is required to make changes.")
    private String currentPassword;

    // Getters and setters here...
}

عند تصحيح الأخطاء ، أرى أنه عندما لا يكون هناك إدخال للاسم الأول أو الأخير ، فإن مثيل BindingResult يحتوي على أخطاء. قلقي هو إعادة التوجيه عندما يكون هناك خطأ. لقد رأيت أسئلة أخرى هنا تُرجع اسم العرض بدلاً من استخدام إعادة التوجيه: بادئة. لقد جربت ذلك ، لكن (على ما أظن) بسبب الطريقة التي أستخدم بها URLRewrite والطريقة التي يتم بها إعداد Servlet الخاص بي بإعداد Spring إلى خطأ. لقد حاولت العودة

/account/settings/change-name
/web/account/settings/change-name
/mywebsite/web/account/settings/change-name

ولكن دون جدوى. FWIW ، إليك رسم خرائط Servlet:

<servlet-mapping>
    <servlet-name>mywebsite</servlet-name>
    <url-pattern>/web/*</url-pattern>
</servlet-mapping>

أي مساعدة موضع تقدير كبير!

هل كانت مفيدة؟

المحلول 2

إليكم كيف حللت مشكلتي. للبدء مع ، لم أكن أرغب في إسقاط استخدام URLRewRiteFilter والبلاط. ومع ذلك ، كانت المشكلة في ذلك هي أنه في حالة الأخطاء ، لم أستطع فقط إعادة المسار ، كما هو موضح في وحدات التحكم RequestMapping حاشية. ملاحظة. فيما يلي الحل الخاص بي ، مع إزالة التوجيه في حالة الأخطاء ، في doChangeName().

@Controller
@RequestMapping(value =  "/account/settings/change-name")
@SessionAttributes("changeNameCommand")
public class ChangeNameController {

    @ModelAttribute("changeNameCommand")
    public ChangeNameCommand getCommand() {        
        return new ChangeNameCommand();
    } 

    @RequestMapping(method = RequestMethod.GET)
    public ModelAndView getChangeNamePage() {
        ModelAndView mav = new ModelAndView("Account.ChangeName");
        mav.addObject("page_title", "Change Name");

        return mav;
    }

    @RequestMapping(method = RequestMethod.POST)
    public ModelAndView doChangeName(@ModelAttribute("changeNameCommand") @Valid ChangeNameCommand command, 
            BindingResult result, SessionStatus status) {

        if (result.hasErrors
            ModelAndView mav = new ModelAndView("Account.ChangeName");
            mav.addObject("page_title", "Change Name");

            return mav;
         }

        // Code here to persist updated user first and last name to database...         

        status.setComplete();

        RedirectView view = new RedirectView("/home");
        return new ModelAndView(view);        
    }
}

شكرا لكل من ساعدني في هذا!

نصائح أخرى

استخدام redirect يجعل جميع سمات الطلب (بما في ذلك الأخطاء والنموذج بأكمله) تختفي. لذلك ، لا تستخدم إعادة التوجيه ، أو استخدم الجلسة لتخزين البيانات مؤقتًا ، أو استخدام المحادثات. أو اكتشف كيفية استخدام شيء مثل النطاق الفلاش (أنا على وشك منذ فترة)

شيء آخر - باستخدام UrlRewriteFilter مع Spring-MVC لا مبرر له. لديك سيطرة كاملة على عناوين URL الشبيهة بالراحة مع Spring-MVC فقط.

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