سؤال

المشكلة التي أواجهها هي أن بلدي التحقق من صحة الفول لا يعمل كما أتوقع.

لديّ حبة مُدارة في جلسة name الحقل المرتبط بـ h:inputText. يجب إدخال الاسم ، وله الحد الأدنى للطول 1 ، وطول أقصى 5 أحرف. أتوقع أنه عندما أدخل الاسم في مربع النص ، سيتم التحقق من صحته وفقًا لذلك بواسطة حبة الدعم ، وإذا فشلت ، فسوف يعرض رسائل الخطأ المقابلة.

ولكن هذا ليس هو الحال. عمليات التحقق من صحة دائمًا, ، حتى لو أدخلت حالة صالحة في inputText (على سبيل المثال "ABC"). عند تصحيح الطلب ، يبدو أن getName() يتم استدعاء الملحق دائمًا ، ولا يتم الوصول إلى Setter أبدًا. أفعل شيئا خاطئا؟ أفترض أن المدقق يستخدم الملحق للتحقق من صحة ، لكن المشكلة هي أن Setter لا يحصل أبدًا على فرصة لتحديث قيمة الاسم ... يجب أن أفتقد شيئًا ما.

فيما يلي الفاصوليا المدارة:

@ManagedBean
@SessionScoped
public class James implements Serializable {

  public James() {
    super();
   }

  private String name;

  @NotNull
  @Min(value = 1)
  @Max(value = 5)
  public String getName() {
    return name;
  }

  public void setName(String name) {
    this.name = name;
  }
}

فيما يلي جزء من JSF XHTML. لقد جربت بعض الاختلافات المختلفة بأشكال منفصلة ، لكن الخيار الأول هو الخيار الذي سأفترض أن أعمله (أعتقد أنه يعادل الخيار الثالث ، ولكن حاول فقط في حالة :))

<h:messages/>
<h:form>
  <h:inputText id="jamesName" value="#{james.name}"/>
  <h:message for="jamesName"/>
  <h:commandButton value="submit"/>
</h:form>
<h:form>
  <h:inputText id="jamesName" value="#{james.name}" immediate="true"/>
  <h:message for="jamesName"/>
  <h:commandButton value="submit"/>
</h:form>
<h:form>
  <h:inputText id="jamesName" value="#{james.name}">
    <f:validateBean />
  </h:inputText>
  <h:message for="jamesName"/>
  <h:commandButton value="submit"/>
</h:form>

أنا أستخدم JSF 2.0.2-FCS مع مدير Entity Hibernate 3.3.2.GA و Hibernate Validator 4.0.2.GA (أدناه هي الأجزاء ذات الصلة من Maven POM) ، والتي تعمل في Tomcat 6.0.20 على Windows XP Pro Service حزمة 3 (32 بت).

<dependency>
  <groupId>javax.faces</groupId>
  <artifactId>jsf-api</artifactId>
  <version>2.0.2-FCS</version>
</dependency>
<dependency>
  <groupId>javax.faces</groupId>
  <artifactId>jsf-impl</artifactId>
  <version>2.0.2-FCS</version>
</dependency>
<dependency>
  <groupId>javax.servlet</groupId>
  <artifactId>jstl</artifactId>
  <version>1.2</version>
</dependency>
<dependency>
  <groupId>javax.servlet.jsp</groupId>
  <artifactId>jsp-api</artifactId>
  <version>2.1</version>
  <scope>provided</scope>
</dependency>
<dependency>
  <groupId>org.hibernate</groupId>
  <artifactId>hibernate-entitymanager</artifactId>
  <version>3.3.2.GA</version>
</dependency>
<dependency>
  <groupId>org.hibernate</groupId>
  <artifactId>hibernate-validator</artifactId>
  <version>4.0.2.GA</version>
</dependency>
هل كانت مفيدة؟

المحلول

التحقق الخاص بك يعمل بشكل صحيح. المشكلة هي مع التعليقات التوضيحية الخاصة بك و @Main:

@NotNull
@Min(value = 1)
@Max(value = 5)
public String getName() {
    return name;
}

Min و Max مخصصة للمقارنة الرقمية. انت كتبت:

يجب إدخال الاسم ، ويبلغ طوله الحد الأدنى من حرف واحد ، وطول أقصى 5 أحرف

يجب عليك استخدام التعليق التوضيحي Size بدلاً من ذلك ، كما في:

@NotNull
@Size(min = 1, max = 5)
public String getName() {
    return name;
}

لا يتم تحديث حقول الفول لأن التحقق من الصحة يفشل. فقط بعد نجاح التحقق من الصحة ، سيتم تحديث الفول.

نصائح أخرى

أما بالنسبة لسؤالك الإضافي - انظر هذه المصفوفة - لا ، فهي غير متوافقة.

حول سؤال JSF - تحقق من كل من سجلات Tomcat و Console Firefox JavaScript.

من أجل رفع خطأ في التجميع في هذا النوع من الحالات ، يمكننا استخدام معالج توضيح مصادقة Hibernate.صحة السبات

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