获取java中的父级层次结构路径

时间:2017-07-28 13:46:11

标签: 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。这里的挑战是我必须在层次结构中提供字段名称动态,如“subject [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;
    }

}

如何动态创建像“subject [0] .revisionMarks [0] .mark”这样的fieldpath。 欢迎任何建议。提前谢谢。

2 个答案:

答案 0 :(得分: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;
    }

答案 1 :(得分:0)

我建议使用JSR3验证而不是重新发明轮子。 https://www.mkyong.com/java/how-to-convert-java-object-to-from-json-jackson/

您可以为POJO中的每个字段添加必要的注释,并添加@Valid注释,让验证者检查嵌套的POJO对象。

链接 https://www.beyondjava.net/blog/how-to-invoke-jsr-303-bean-validation-programmatically/显示了如何以编程方式调用验证程序。

通过验证,您可以提供任何消息并对其进行本地化,并自动构建xpath,指出POJO或嵌套POJO中的问题。

相关问题