Come iniettare la dipendenza guice nell'interfaccia mapstruct - java

Nov 10 2020

I miei oggetti

 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
}

Ho un'interfaccia

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

}

Ho intenzione di iniettare quel Gson invece del nuovo Gson ()

In base a questo come posso combinare Guice e Mapstruct?

Ho provato ad apportare modifiche ma non so dove aggiungerlo

@Inject
Gson gson

Ho provato in questo modo

public interface TestjkMapper {

  @Inject
  Gson gson

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

}

Ricevo un errore del compilatore come di seguito

variable gson might not have been initialized

come iniettare correttamente all'interno di quell'interfaccia

Anche qui

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

TestjkMapper - La mia interfaccia

TestjkMapperImpl: viene generato in fase di esecuzione. Quindi non sono sicuro di come associarlo

Domanda esatta:

Come convertire uno studente objectin uno studente Stringusando guice iniettatogson

Risposte

Filip Nov 11 2020 at 18:27

Se desideri utilizzare componenti iniettati personalizzati nei tuoi mappatori, dovrai utilizzare classi astratte anziché interfacce. Non puoi iniettare campi nelle interfacce.

Nel tuo esempio sarà simile a:

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

}