8

私はMapstructが初めてです。ターゲット オブジェクトにキー値ペア <String,String> を持つ Java マップがあり、ソース オブジェクトの内部オブジェクト プロパティ/データ メンバー値を使用してこのマップを埋める必要があるシナリオがあります。

私のコードは次のようなものです(ダミーコード):

public class Student {
    public String name;
    public String rollNo;
    public Map<String, String> marks;
}


public class ExamResult{

    public String stud_name;
    public String Stud_rollNo;
    public Marks marks;
}

public class Marks{
    public Integer English;
    public Integer Maths;
    public Integer Science;
}

次のように手動で同じことを達成するにはどうすればよいですか。

Student target;
ExamResult source;
target.setName(source.stud_name);
target.setRollNo(source.Stud_RollNo);
target.marks.put("ENGLISH",source.marks.english_marks);
target.marks.put("MATHS",source.marks.math_marks);
target.marks.put("SCIENCE",source.marks.science_marks);

直接プロパティ マッピングについては、コードを見つけましたが、マップに入力する値をマップする方法がわかりませんmarks

Java式を使用してターゲットマップ値を入力することを考えていましたが、ドキュメントやターゲットオブジェクトを使用した式の例は見つかりませんでした。

私は怒鳴るように使用することを考えていましたが、それがうまくいくかどうかはわかりません:

    @Mapping(source = "stud_name", target = "name")
    @Mapping(source = "Stud_RollNo", target = "rollNo")
    @Mapping(source = "source.marks.english_marks",target = "java( marks.put(\"ENGLISH\",source.marks.english_marks )")
    @Mapping(source = "source.marks.math_marks",target = "java( marks.put(\"MATHS\",source.marks.math_marks )")
    @Mapping(source = "source.marks.science_marks",target = "java( marks.put(\"SCIENCE\",source.marks.science_marks )")
Student doConvert(ExamResult src)

ヘルプ、提案、または回避策をいただければ幸いです。前もって感謝します。

4

3 に答える 3

0

マークをマップ オブジェクトに変換するカスタム マッパー メソッドを記述します。

@Mapping(source = "stud_name", target = "name")
@Mapping(source = "Stud_rollNo", target = "rollNo")
Student doConvert(ExamResult examResult);

static Map<String,String> mapMarks(Marks marks) {
    Map<String,String> marksMap = new HashMap<>();
    marksMap.put("ENGLISH", String.valueOf(marks.getEnglish()));
    marksMap.put("MATHS", String.valueOf(marks.getMaths()));
    return marksMap;
}

マップ要素が大きすぎて言及できない場合は、Jackson Library を使用して、参照名をキー、オブジェクト値を値としてマップを動的に作成できます。

@Mapping(source = "stud_name", target = "name")
@Mapping(source = "Stud_rollNo", target = "rollNo")
Student doConvert(ExamResult examResult);

ObjectMapper mapper = new ObjectMapper();
static Map<String,String> mapMarks(Marks marks) {
    return mapper.convertValue(marks, Map.class);
}
于 2020-07-18T22:46:32.510 に答える