2017-07-28 2 views
0

Ich habe ein Szenario, um eine Child-Hierarchie-Struktur eines Feldes bis Elternteil für Validierungen auf Feldebene zu erhalten. Kann jemand eine Lösung bereitstellen.Holen Kind Hierarchiepfad bis Elternteil in Java

Pojo Klassen

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; 
    } 
} 

Jetzt fügen wir eine Validierung hinzu, um zu überprüfen, ob die angegebene Marke in der Revisionsmarks-Klasse gültig ist oder nicht. Wenn es gleich Null ist, muss ich es zu Fehler dto hinzufügen und es zurück zur UI senden. Die Herausforderung hier ist, dass ich den Feldnamen dynamisch in der Hierarchie wie "subjects [0] .revisionMarks [0] .mark" angeben muss.

Hauptklasse 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; 
    } 

} 

Wie kann ich dynamisch den fieldpath wie "Themen [0] .revisionMarks [0] .mark" erstellen. Alle Vorschläge sind willkommen. Danke im Voraus.

+0

Fügen Sie einen Zähler hinzu, den Sie bei jeder Iteration der Schleife erhöhen –

+0

Danke .. Das hilft .. – Shiva

Antwort

0

Verwenden Sie einen Zähler:

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

Danke für den geänderten Code. das hilft wirklich. – Shiva

0

Ich würde vorschlagen, JSR3 Validierung statt neu zu erfinden Rad zu verwenden.

Sie können für jedes Feld in Ihrem POJO die erforderlichen Anmerkungen hinzufügen und @Valid-Annotationen hinzufügen, damit der Validierer verschachtelte POJO-Objekte prüfen kann.

Der Link https://www.beyondjava.net/blog/how-to-invoke-jsr-303-bean-validation-programmatically/ zeigt, wie der Validator programmgesteuert aufgerufen wird.

Mit der Validierung können Sie alle Nachrichten bereitstellen und lokalisieren, und die XPaths werden automatisch Pointing-Probleme in POJO oder verschachtelte POJOs erstellt.

Verwandte Themen