2017-07-28 18 views
0

フィールドレベルの検証を行うために、親からフィールドまでの子階層構造を取得するシナリオがあります。 誰かが解決策を提供することはできますか?子階層のパスをJavaの親まで取得

POJOクラス

Student.java

package com.poc.next.validations; 

import java.util.ArrayList; 
import java.util.List; 

public class Student { 
    private String studentName; 
    private List<Subject> subjects; 

    public String getStudentName() { 
     return studentName; 
    } 

    public void setStudentName(String studentName) { 
     this.studentName = studentName; 
    } 

    public List<Subject> getSubjects() { 
     if (subjects == null) { 
      return new ArrayList<>(); 
     } 
     return subjects; 
    } 

    public void setSubjects(List<Subject> subjects) { 
     this.subjects = subjects; 
    } 
} 

Subject.java

package com.poc.next.validations; 

import java.util.ArrayList; 
import java.util.List; 

public class Subject { 

    private String subjectName; 
    private List<RevisionMarks> revisionMarks; 

    public String getSubjectName() { 
     return subjectName; 
    } 

    public void setSubjectName(String subjectName) { 
     this.subjectName = subjectName; 
    } 

    public List<RevisionMarks> getRevisionMarks() { 
     if (revisionMarks == null) { 
      return new ArrayList<>(); 
     } 
     return revisionMarks; 
    } 

    public void setRevisionMarks(List<RevisionMarks> revisionMarks) { 
     this.revisionMarks = revisionMarks; 
    } 
} 

RevisionMarks.java

package com.poc.next.validations; 

public class RevisionMarks { 

    private Integer mark; 
    private String revision; 

    public Integer getMark() { 
     return mark; 
    } 

    public void setMark(Integer mark) { 
     this.mark = mark; 
    } 

    public String getRevision() { 
     return revision; 
    } 

    public void setRevision(String revision) { 
     this.revision = revision; 
    } 
} 

ここで、RevisionMarksクラス内の指定されたマークが有効かどうかを確認する検証を追加します。それがゼロに等しい場合、私はそれをエラーdtoに追加してUIに送り返す必要があります。ここでの課題は、 "subjects [0] .revisionMarks [0] .mark"のような階層でフィールド名を動的に提供する必要があることです。

メインクラス RevisionValidation.java

package com.poc.next.validations; 

import java.util.ArrayList; 
import java.util.Iterator; 
import java.util.List; 

public class RevisionValidation { 

    public static void main(String[] args) { 
     Student student = populateStudentData(); 
     Iterator<Subject> iterator = student.getSubjects().iterator(); 
     while (iterator.hasNext()) { 
      Subject subject = (Subject) iterator.next(); 
      RevisionMarks revisionMarks = subject.getRevisionMarks().get(0); 
      System.out.println(revisionMarks.getMark()); 
      if (revisionMarks.getMark() == 0) { 
       ErrorDTO errorDTO = new ErrorDTO(true, "Invalid Marks", "Error", "subjects[0].revisionMarks[0].mark", 
         "invalid_mark"); 
       System.out.println(errorDTO); 
      } 
     } 
    } 

    private static Student populateStudentData() { 
     List<RevisionMarks> revisionMarks = new ArrayList<>(); 
     RevisionMarks revisionMark = new RevisionMarks(); 
     revisionMark.setMark(0); 
     revisionMark.setRevision("Test 1"); 
     revisionMarks.add(revisionMark); 

     List<Subject> subjects = new ArrayList<>(); 
     Subject subject = new Subject(); 
     subject.setSubjectName("CS"); 
     subject.setRevisionMarks(revisionMarks); 
     subjects.add(subject); 

     Student student = new Student(); 
     student.setStudentName("Sample"); 
     student.setSubjects(subjects); 
     return student; 
    } 

} 

どのように私は動的に "被験者は[0] .revisionMarks [0] .mark" のようなfieldpathを作成することができます。 ご提案は大歓迎です。前もって感謝します。

+0

ループの各繰り返しで増加するカウンタを追加してください –

+0

ありがとうございました。それは.. – Shiva

答えて

0

は、カウンタを使用します。

int counter = 0; 
    Iterator<Subject> iterator = student.getSubjects().iterator(); 
    while (iterator.hasNext()) { 
     Subject subject = (Subject) iterator.next(); 
     RevisionMarks revisionMarks = subject.getRevisionMarks().get(0); 
     System.out.println(revisionMarks.getMark()); 
     if (revisionMarks.getMark() == 0) { 
      ErrorDTO errorDTO = new ErrorDTO(true, "Invalid Marks", "Error", "subjects[" + counter + "].revisionMarks[0].mark", 
        "invalid_mark"); 
      System.out.println(errorDTO); 
     } 
     ++counter; 
    } 
+0

ありがとうございました。それは本当に役立ちます。 – Shiva

0

私の代わりに車輪の再発明のJSR3の検証を使用することをお勧めします。 https://www.mkyong.com/java/how-to-convert-java-object-to-from-json-jackson/

あなたのPOJOの各フィールドに必要な注釈を追加し、バリデータチェック、ネストされたPOJOオブジェクトをできるように@Valid注釈を追加することができます。

リンク https://www.beyondjava.net/blog/how-to-invoke-jsr-303-bean-validation-programmatically/は、プログラマチックにバリデーターを呼び出す方法を示しています。

妥当性検査では、メッセージを提供してローカライズすることができ、xpathはPOJOまたはネストされたPOJOの問題を自動的に指し示して構築されます。

関連する問題