วิธีการฉีด guice dependency ใน mapstruct interface - java

Nov 10 2020

วัตถุของฉัน

 Public void Student(){
     private string name;
     private int age;
 }

Public void ClassRoom(){
   private string roomNo;
   private Student student; //Student Object
}

Public void School(){
   private string roomNo;
   private String student; //String student
}

ฉันมีอินเทอร์เฟซ

@Mapper(componentModel = "jsr330", unmappedTargetPolicy = ReportingPolicy.IGNORE, builder = @Builder(disableBuilder = true))
public interface TestjkMapper {

    @Named("convertObjToString")
    static String convertObjToString(Student student) {
        return new Gson.tojson(student)
    }

   @Mapping(source = "student", target = "student",qualifiedByName = "convertObjToString")
   School mapClassRoomToSchool(@NonNull ClassRoom classRoom);

}

ฉันวางแผนที่จะฉีด gson นั้นแทน Gson ใหม่ ()

ตามนี้ฉันจะรวม Guice และ Mapstruct ได้อย่างไร?

ฉันพยายามทำการเปลี่ยนแปลง แต่ไม่แน่ใจว่าจะเพิ่มที่ใด

@Inject
Gson gson

ฉันพยายามแบบนี้

public interface TestjkMapper {

  @Inject
  Gson gson

    @Named("authorityToMap")
    static Map authorityToMap(Authority authority) {
        return gson.tojson(authority.tostring())
    }

}

ฉันได้รับข้อผิดพลาดของคอมไพเลอร์ดังต่อไปนี้

variable gson might not have been initialized

วิธีการฉีดอย่างถูกต้องภายในอินเทอร์เฟซนั้น

ที่นี่ยัง

bind(TestjkMapper.class).to(TestjkMapperImpl.class)

TestjkMapper - อินเทอร์เฟซของฉัน

TestjkMapperImpl - สิ่งนี้ถูกสร้างขึ้นที่รันไทม์ เลยไม่แน่ใจว่าจะผูกยังไง

คำถามที่แน่นอน:

วิธีแปลง Student objectเป็น Student Stringโดยใช้ guice injectiongson

คำตอบ

Filip Nov 11 2020 at 18:27

หากคุณต้องการใช้คอมโพเนนต์ที่ฉีดขึ้นเองในตัวสร้างแผนที่คุณจะต้องใช้คลาสนามธรรมแทนอินเทอร์เฟซ คุณไม่สามารถแทรกฟิลด์ลงในอินเทอร์เฟซ

ในตัวอย่างของคุณจะมีลักษณะดังนี้:

@Mapper(componentModel = "jsr330", unmappedTargetPolicy = ReportingPolicy.IGNORE, builder = @Builder(disableBuilder = true))
public abstract class TestjkMapper {

    @Inject
    Gson gson;

    @Named("convertObjToString")
    static String convertObjToString(Student student) {
        return gson.tojson(student)
    }

   @Mapping(source = "student", target = "student", qualifiedByName = "convertObjToString")
   School mapClassRoomToSchool(@NonNull ClassRoom classRoom);

}