Как внедрить зависимость guice в интерфейс mapstruct - 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 вместо new 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 - создается во время выполнения. Так что не знаю, как связать это

Точный вопрос:

Как преобразовать ученика objectв ученика Stringс помощью введенного guicegson

Ответы

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

}