Cách thêm sự phụ thuộc guice vào giao diện mapstruct - Java

Nov 10 2020

Đối tượng của tôi

 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
}

Tôi có một giao diện

@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);

}

Tôi đang định tiêm gson đó thay vì Gson mới ()

Theo điều này Tôi có thể kết hợp Guice và Mapstruct bằng cách nào?

Tôi đã cố gắng thực hiện các thay đổi nhưng không biết phải thêm vào đâu

@Inject
Gson gson

Tôi đã thử như thế này

public interface TestjkMapper {

  @Inject
  Gson gson

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

}

Tôi gặp lỗi trình biên dịch như bên dưới

variable gson might not have been initialized

cách tiêm chính xác bên trong giao diện đó

Đây cũng

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

TestjkMapper - Giao diện của tôi

TestjkMapperImpl - Điều này được tạo trong thời gian chạy. Vì vậy, không chắc chắn làm thế nào để ràng buộc điều này

Câu hỏi chính xác:

Làm thế nào để chuyển đổi Sinh viên objectthành Sinh viên Stringbằng cách sử dụng guice injectiongson

Trả lời

Filip Nov 11 2020 at 18:27

Nếu bạn muốn sử dụng các thành phần được chèn tùy chỉnh trong trình ánh xạ của mình, bạn sẽ cần sử dụng các lớp trừu tượng thay vì giao diện. Bạn không thể đưa các trường vào giao diện.

Trong ví dụ của bạn, nó sẽ giống như sau:

@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);

}